【问题标题】:Spring Security Expression Baed Access Control with JwtAuthenticationToken使用 JwtAuthenticationToken 的基于 Spring 安全表达式的访问控制
【发布时间】:2020-11-03 12:26:11
【问题描述】:

我正在开发一个使用 spring-boot-starter-oauth2-resource-server 来确保安全的 RESTful 服务。它有一些复杂的端点授权要求,涉及的决策不仅基于角色,还基于 JWT 中的其他声明,如位置。所以 HttpSecurity 配置的 hasRole 是不够的。

有没有办法将 JwtAuthenticationToken 中的值与 Sprng Security 的基于表达式的访问控制和 HttpSecurity 的 access(String attribute) 方法一起使用?还是有其他方法可以将不同的声明集成到端点授权中?

任何建议都将不胜感激

【问题讨论】:

    标签: spring-security jwt spring-security-oauth2


    【解决方案1】:

    您可以使用 SPEL 访问 Authentication 对象, 所以像这样的表达:

    authentication.token.claims['preferred_username'] == ......

    我在方法中使用过它: 例如

    PreAuthorize("#createSupportQueryRequest.username == authentication.token.claims['preferred_username']")
    public void createNewQuery(@RequestBody CreateSupportQueryRequest createSupportQueryRequest) {
    

    但它也应该在 .access 方法中工作。

    对于更复杂的内容,您可以使用 @ 在表达式中引用上下文中的 bean 类。 例如

    .access("@isPortfolioOwnerOrAdmin.check()")
    

    这将调用 IsPortfolioOwnerOrAdmin 类的检查方法。

    您的 bean 类可以通过 SecurityConect 访问令牌,您可以在那里执行复杂的验证逻辑并返回 true 或 false。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2016-03-27
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 2016-02-28
      • 2011-11-02
      相关资源
      最近更新 更多