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

基本上我想在解析 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 



浮云间
浏览 163回答 1
1回答

富国沪深

我知道你没有问这个,但是从标题中建立额外的权限听起来有点冒险,除非你相信它的来源(例如它是签名的或类似的)。这听起来很奇怪,因为使用 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}然后注册它:@Configurationpublic 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 道路上走得太远,那么从那里开始就很有价值。在那种情况下,配置仍然非常相似:@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {    @Override    protected void configure(HttpSecurity http) {        // ...        http.addFilterAfter(new XGroupFilter(), BearerTokenAuthenticationFilter.class);    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java