如何使用基于Scope的@PreAuthorize来保护spring-security-oauth资源?

时间:2015-11-10 20:20:35

标签: java spring spring-security-oauth2

我成功配置了spring-security-oauth2,以便外部应用程序可以使用我的应用程序进行身份验证。但是,基于外部应用程序并基于用户允许的内容,客户端只能访问我的API的一部分。可用子集由OAuth Scopes确定。

在经典的Spring应用程序中,我可以使用@PreAuthorize来强制基于角色的边界:

@Controller
public class MyController {
  @PreAuthorize("hasRole('admin')")
  @RequestMapping("...")
  public String doStuff() {
    // ...
  }
}

使用OAuth和Scopes而不是角色时,我该怎么做?

1 个答案:

答案 0 :(得分:17)

Spring OAuth附带OAuth2MethodSecurityExpressionHandler,这个类增加了使用@PreAuthorize表达式进行此类检查的功能。您需要做的就是注册这个课程,例如如果你使用的是Javaconfig,请这样:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public static class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        return new OAuth2MethodSecurityExpressionHandler();
    }
}

现在你可以简单地使用:

@PreAuthorize("#oauth2.hasScope('requiredScope')")

保护您的请求方法。要查看hasScope旁边可用的其他方法,请查看课程OAuth2SecurityExpressionMethods

缺点是OAuth2MethodSecurityExpressionHandler扩展了DefaultMethodSecurityExpressionHandler,因此你无法将它与其他同样扩展此类的类结合起来。

作为替代方案,您也可以map OAuth scopes to classic user roles