如何使用自定义验证规则扩展 Spring Security 的 @Preauthorize?

rel*_*ood 3 spring-security jwt

Spring Security 提供了一些方便的方法控制注解:

@PreAuthorize("hasRole('ADMIN')")
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@PreAuthorize("hasPermission('ADD')")
Run Code Online (Sandbox Code Playgroud)

我想用一些自定义方法来扩展它,比如

 @PreAuthorize("hasCompany('XX')") 
Run Code Online (Sandbox Code Playgroud)

其验证数据应来自 JWT 令牌。

任何人都可以帮忙吗?

won*_*hee 5

有几种方法可以做到,但@Andrew 提到的会更容易。只是指出你说你想检查你的 JWT 令牌是否有特定的公司“XX”,那么它将是

@PreAuthorize("@yourBeanName.customMethod(authentication)")

在 yourBeanName 实例中,您需要实现一个方法来从中提取公司信息并比较这两者,

或者,也许你可以做类似的事情

@PreAuthorize("#oauth2.hasCompany('XX')")

与普通 SpringEL 可以使用 oauth2 访问令牌执行的操作相同。

要做到这一点,

  1. 您需要实现自己的 DefaultMethodSecurityExpressionHandler (检查 OAuth2MethodSecurityExpressionHandler 进行比较)
  2. 并且当您实现 createEvaluationContextInternal() 方法时,您需要新的 OAuth2 表达式处理程序,而不是 OAuth2SecurityExpressionMethods,因为它没有“hasCompany()”自定义方法。只需创建一个扩展 OAuth2SecurityExpressionMethods 的新类并添加 hasCompany() 方法,并将其插入新的 DefaultMethodSecurityExpressionHandler。