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

时间:2018-11-30 08:41:01

标签: spring-security jwt

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

@PreAuthorize("hasRole('ADMIN')")
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@PreAuthorize("hasPermission('ADD')")

我想用

这样的自定义方法扩展它
 @PreAuthorize("hasCompany('XX')") 

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

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

set apps= for /d %%s in (".\manifests\*.xml") do ( for /f "tokens=*" %%g in ('xml sel -t -v "\apps\app" %cd%\manifests\%%s') do ( echo Found app - %%g [inside %%s] rem First idea below: set apps[%%g]=true ) ) rem How to iterate apps afterwards?

在yourBeanName实例内部,您需要实现一种从中提取公司信息并比较两者的方法,

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

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

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

为此,

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

答案 1 :(得分:1)

您可以在自定义bean实现@PreAuthorize("@yourBeanName.customMethod(authentication.principal.username)")

中创建一个方法