Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Spring安全OAuth2(提供程序)中使用作用域作为角色 让我们考虑一个相当简单的假设应用程序,用户可以读或写文章。_Spring_Oauth_Spring Security_Oauth 2.0_Spring Security Oauth2 - Fatal编程技术网

在Spring安全OAuth2(提供程序)中使用作用域作为角色 让我们考虑一个相当简单的假设应用程序,用户可以读或写文章。

在Spring安全OAuth2(提供程序)中使用作用域作为角色 让我们考虑一个相当简单的假设应用程序,用户可以读或写文章。,spring,oauth,spring-security,oauth-2.0,spring-security-oauth2,Spring,Oauth,Spring Security,Oauth 2.0,Spring Security Oauth2,一些用户可以阅读和撰写文章,而另一些用户只能阅读。使用Spring Security(3.2.1),我通过两个角色对此进行建模: ROLE_WRITE:此角色授予用户写文章的权限 ROLE_READ:此角色授予用户阅读文章的权限 用Spring安全性实现这一点相当简单 现在,我还希望通过使用实现OAuth2提供程序,允许第三方应用程序代表用户读写文章 在授权步骤中,应用程序会询问用户是否愿意授予其阅读和/或写文章的权利。此处的用户正在此处授予作用域(而不是角色) 然后,当OAuth2使用者调

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

  • ROLE_WRITE:此角色授予用户写文章的权限
  • ROLE_READ:此角色授予用户阅读文章的权限
用Spring安全性实现这一点相当简单

现在,我还希望通过使用实现OAuth2提供程序,允许第三方应用程序代表用户读写文章

在授权步骤中,应用程序会询问用户是否愿意授予其阅读和/或写文章的权利。此处的用户正在此处授予作用域(而不是角色)

然后,当OAuth2使用者调用我的RESTAPI时,Spring Sec OAuth会授权授予的令牌,并创建一个身份验证,其中包含用户及其所有角色,并且只包含授予的范围

问题是,我现在必须编写不同的安全逻辑,这取决于API是由正常身份验证的用户调用的(只需检查角色),还是通过OAuth2调用的(检查角色+作用域)

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

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

阅读注释后,您会发现另一种方法:添加自定义
TokenStore
ResourceServerTokenServices
。这些是易于访问的扩展点,允许修改
OAuth2Authentication
,使其授予的权限与作用域相同


但是,我的首选是使用OAuth2RequestFactory控制允许的作用域,在令牌授予点将其限制为与用户权限一致的值。

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

谢谢Dave。我忘了提到我在我的服务方法上使用@Secured注释(我没有使用Spring-Sec HTTP-path-security/antMatchers(“/path”).access(…)。这种方法还能用吗?我不明白为什么不能。现在我们正在讨论“你做了什么,为什么它不起作用?”似乎我可以用我自己的impl-in-GlobalMethodSecurityConfiguration.accessDecisionManager替换RoleVoter。这将处理@Secured方法,但对于直接访问authentication.getAuthories()的任何其他代码,我都必须小心。在浏览了一些代码之后,在我的例子中,似乎最简单的方法是实现我自己的OAuth2AuthenticationManager,它将只返回具有授权权限的身份验证。我看到它在OAuth2ResourceServerConfigurer.oauthAuthenticationManager中被实例化。是否有一个易于与我自己的进行交换的方法?我们没有向java config builder公开这个方法,但是过滤器上有一个setter。所以当我们在SpringOAuth中整理它时,您可以自己使用它(而不是使用
@enableSourceServer
)。如果愿意,可以在GitHub中提出问题。最后一条评论:如果我是你,我会使用自定义的
TokenStore
(或
ResourceServerTokenServices
),您可以在
@enableSourceServer
适配器中自定义。