【问题标题】:How to extend the Spring Security's @Preauthorize with custom validating rule?如何使用自定义验证规则扩展 Spring Security @Preauthorize?
【发布时间】:2019-05-02 09:38:20
【问题描述】:

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

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

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

 @PreAuthorize("hasCompany('XX')") 

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

谁能帮忙?

【问题讨论】:

    标签: spring-security jwt


    【解决方案1】:

    有几种方法可以做到这一点,但@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。

    【讨论】:

      【解决方案2】:

      您可以在自定义 bean 实现中创建一个方法@PreAuthorize("@yourBeanName.customMethod(authentication.principal.username)")

      【讨论】:

        猜你喜欢
        • 2015-07-30
        • 1970-01-01
        • 2017-12-01
        • 1970-01-01
        • 2012-03-31
        • 2013-08-23
        • 2019-02-06
        • 2017-07-25
        • 2014-04-20
        相关资源
        最近更新 更多