Java 如何使用基于作用域的@PreAuthorize保护spring安全oauth资源?
我成功地配置了spring-security-oauth2,以便外部应用程序可以通过我的应用程序进行身份验证。但是,基于外部应用程序和用户允许的内容,客户端只能访问my API的一个子集。可用子集由OAuth作用域确定 在经典的Spring应用程序中,我可以使用@PreAuthorize根据角色强制执行边界:Java 如何使用基于作用域的@PreAuthorize保护spring安全oauth资源?,java,spring,spring-security-oauth2,Java,Spring,Spring Security Oauth2,我成功地配置了spring-security-oauth2,以便外部应用程序可以通过我的应用程序进行身份验证。但是,基于外部应用程序和用户允许的内容,客户端只能访问my API的一个子集。可用子集由OAuth作用域确定 在经典的Spring应用程序中,我可以使用@PreAuthorize根据角色强制执行边界: @控制器 公共类MyController{ @预授权(“hasRole('admin')”) @请求映射(“…”) 公共字符串doStuff(){ // ... } } 当使用OAuth
@控制器
公共类MyController{
@预授权(“hasRole('admin')”)
@请求映射(“…”)
公共字符串doStuff(){
// ...
}
}
当使用OAuth和作用域而不是角色时,我如何做到这一点?Spring OAuth附带了
OAuth2MethodSecurityExpressionHandler
,该类增加了使用@PreAuthorize表达式进行此类检查的能力。您需要做的就是注册这个类,例如,如果您使用的是Javaconfig:
@配置
@EnableGlobalMethodSecurity(Prespenabled=true)
公共静态类方法SecurityConfig扩展了GlobalMethodSecurityConfiguration{
@凌驾
受保护的MethodSecurityExpressionHandler createExpressionHandler(){
返回新的OAuth2MethodSecurityExpressionHandler();
}
}
现在,您可以简单地使用:
@PreAuthorize(#oauth2.hasScope('requiredScope'))
以保护您的请求方法。要查看除了hasScope
之外还有哪些方法可用,请检查类OAuth2SecurityExpressionMethods
缺点是,OAuth2MethodSecurityExpressionHandler
扩展了DefaultMethodSecurityExpressionHandler
,因此不能将其与其他也扩展该类的类组合
你也可以这样做。我使用的是Spring Boot 1.5.10,而
oauth2.hasScope…
在不重写createExpressionHandler()的情况下工作。
你知道我如何使用@PreAuthorize(#oauth2.hasScope('requiredScope')对函数进行单元测试吗?我已经根据其他安全标准对其进行了分类,但我无法理解这一点。