让我们考虑一个相当简单的假设应用程序,用户可以在其中阅读或撰写帖子。
有些用户可以阅读和撰写文章,而另一些用户只能阅读。使用Spring Security(3.2.1),我通过扮演2个角色来对此建模:
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发现的类型使用相同的值。
ExpressionHandler
Authentication
阅读注释后,建议使用其他方法:添加自定义TokenStore或ResourceServerTokenServices。这些是易于访问的扩展点,将允许OAuth2Authentication对其进行修改,以使其授予的权限与范围相同。
TokenStore
ResourceServerTokenServices
OAuth2Authentication
但是,我的首选是使用来控制允许的范围OAuth2RequestFactory,在令牌授予时将它们限制为与用户权限一致的值。
OAuth2RequestFactory