为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据 http header 过滤 JWT 身份验证权限

如何根据 http header 过滤 JWT 身份验证权限

浮云间 2022-06-30 17:55:54
基本上我想在解析 JWT 令牌之后和调用该方法之前实现一个过滤器,并能够根据 http 标头修改身份验证对象语境在我们的应用程序中,我们有(除其他外)三个与身份验证/授权相关的实体:用户、权限和组。权限可以直接分配给用户,也可以分配给用户所属的组之一。鉴于此,JWT 令牌如下所示:{  "username": "duck",  "groups": [    {      "name": "swimmer",      "permissions": [        "swim"      ]    },    {      "name": "walker",      "permissions": [        "walk"      ]    }  ],  "permissions": [    "quack"  ]}JWT 流程是设置扩展AuthorizationServerConfigurerAdapter和ResourceServerConfigurerAdapter,并且权限是通过扩展从 JWT 声明的映射中提取的DefaultUserAuthenticationConverter通过@EnableGlobalMethodSecurity(prePostEnabled = true)在配置中使用,我可以用 @PreAuthorize例如:@PreAuthorize("hasPermission('quack')")public void quack();这适用于直接分配给用户的权限。但是我想接收一个 http 标头,例如:'x-group' 并将该组的权限(如果有)添加到身份验证对象然后,给定上面设置为 http 标头的“jwt”,swimmer我希望能够调用以下方法:@PreAuthorize("hasPermission('swim')")public void 
查看完整描述

1 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

我知道你没有问这个,但是从标题中建立额外的权限听起来有点冒险,除非你相信它的来源(例如它是签名的或类似的)。这听起来很奇怪,因为使用 OAuth 的原因通常是只有授权服务器才是颁发机构。


由于您已经在使用DefaultUserAuthenticationConverter,我想知道您是否能够从后端获得相同的额外权限,例如通过UserDetailsService?


也就是说,要回答您的问题,您可以添加一个过滤器:


public class XGroupFilter extends OncePerRequestFilter {

    // ... look up current Authentication

    // ... look up and validate header

    // ... create new instance of Authentication, adding the new authorities

}

然后注册它:


@Configuration

public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override

    public void configure(HttpSecurity http) {

        // ...


        http.addFilterAfter(new XGroupFilter(), OAuth2AuthenticationProcessingFilter.class);

    }

}

或者,如果您可以选择升级,那么从 Spring Security 5.1 开始提供新的支持,这会稍微简化一些事情。您现在使用的是一个名为 Spring Security OAuth 的遗留插件项目,但现在原生内置了支持。此外,这也是新功能的发展方向,如果您还没有在 Spring Security OAuth 道路上走得太远,那么从那里开始就很有价值。


在那种情况下,配置仍然非常相似:


@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override

    protected void configure(HttpSecurity http) {

        // ...


        http.addFilterAfter(new XGroupFilter(), BearerTokenAuthenticationFilter.class);

    }

}


查看完整回答
反对 回复 2022-06-30
  • 1 回答
  • 0 关注
  • 162 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信