如何利用基于作用域的@PreAuthorize来保护spring-security-oauth资源?

2022-09-03 12:23:30

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

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

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

在使用 OAuth 和作用域而不是角色时,如何执行相同的操作?


答案 1

Spring OAuth 附带了 ,该类增加了使用@PreAuthorize表达式执行此类检查的功能。您需要做的就是注册此类,例如,如果您使用的是Javaconfig,则如下所示:OAuth2MethodSecurityExpressionHandler

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

现在,您可以简单地使用:

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

以保护您的请求方法。要查看除了类之外还有哪些其他方法可用,请检查类 。hasScopeOAuth2SecurityExpressionMethods

缺点是扩展了,因此您无法将其与也扩展此类的其他类组合在一起。OAuth2MethodSecurityExpressionHandlerDefaultMethodSecurityExpressionHandler

作为替代方法,还可以将 OAuth 作用域映射到经典用户角色


答案 2

推荐