繁体   English   中英

在Spring Security OAuth2(提供程序)中使用作用域作为角色

[英]Using scopes as roles in Spring Security OAuth2 (provider)

让我们考虑一个相当简单的假设应用程序,用户可以在其中阅读或撰写帖子。

有些用户可以阅读和撰写文章,而有些用户只能阅读。 使用Spring Security(3.2.1),我通过两个角色对此进行了建模:

  • ROLE_WRITE:此角色授予用户访问撰写帖子的权限。
  • ROLE_READ:此角色授予用户访问阅读帖子的权限。

使用Spring安全性实现这一点非常简单......

现在,我想通过使用Spring Security OAuth(版本2.0.0.M3 ATM)实现OAuth2提供程序,允许第三方应用程序代表用户读写帖子。

在授权步骤期间,应用程序询问用户是否愿意代表他们授予阅读和/或撰写帖子的权利。 这里的用户在这里授予范围(不是角色)。

然后,当OAuth2使用者调用我的REST API时,Spring Sec OAuth会授权所授予的令牌并创建一个身份验证,其中包含具有所有角色的用户以及仅授予的作用域。

问题(和问题)是我现在必须编写不同的安全逻辑,具体取决于API是否由正常身份验证的用户调用(只检查角色)或是否通过OAuth2调用(检查角色+范围)。

是否可以在Spring Security OAuth2中“合并”角色和范围的概念,以便在授权步骤中,用户向应用程序授予他们拥有的角色的子集(并且让OAuth2身份验证仅在授予的权限中报告这些角色 ) ? 这样,当第三方应用程序进行API调用时,身份验证中的角色是授予的角色? 这样我就不必编写任何特定于OAuth2的安全逻辑。

范围(和角色)是任意字符串,因此如果您想制作相同的字符串则没有问题。 要使访问规则声明相同,您可以编写一个ExpressionHandler ,它根据所找到的Authentication类型测试具有相同值的权限或作用域。

阅读注释后,会有一种不同的方法:添加自定义TokenStoreResourceServerTokenServices 这些是易于访问的扩展点,并允许修改OAuth2Authentication以便其授予的权限与范围相同。

但是,我的偏好是使用OAuth2RequestFactory控制允许的范围,在令牌授予点将它们限制为与用户权限一致的值。

您可以配置自己的AccessTokenConverter(主要用于JWT)并从JWT访问令牌中提取所需的声明并生成Authority对象。 只需定义一个返回AccessTokenConverter的Bean工厂

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM