Spring Security 检查外部 JWT 角色

Posted

技术标签:

【中文标题】Spring Security 检查外部 JWT 角色【英文标题】:Spring Security check external JWT roles 【发布时间】:2021-12-21 11:18:17 【问题描述】:

我很难理解如何从外部 JWT 中检查角色,或者是否有可能。

我的登录页面在另一个外部页面上,我从该页面收到一个 jwt 令牌。 在我的项目中,我需要检查该 jwt 令牌的有效性并根据声明中的角色限制一些端点。

我可以在 jwtFilter 中以某种方式做到这一点,但我没有设法检查在 .antMatchers() 上应用的“.hasAnyRole()”或“.hasAnyAuthority()”。 我尝试在 spring security 中手动登录用户,但没有成功。

这是spring security的配置:

http.cors()
            .addFilterBefore(jwtFilter, BearerTokenAuthenticationFilter.class)
            .cors()
            .and()
            .csrf()
            .disable()
            .authorizeRequests()
            .antMatchers(
                    "/index.html"
            )
            .authenticated()
            .and()
            .authorizeRequests()
            .antMatchers("/machines/**").hasAuthority("ROLE_USER")
            .and()
            .headers()
            .frameOptions()
            .disable()
           

我尝试像这样手动登录:

Authentication authentication = new UsernamePasswordAuthenticationToken(jwt.getUsername, null,
                    AuthorityUtils.createAuthorityList(jwt.getRoles()));
SecurityContextHolder.getContext().setAuthentication(authentication);

您知道如何使用 .hasAnyRole() 并仅拥有 jwtToken 吗?

【问题讨论】:

【参考方案1】:

您尚未声明如何将您的角色定义为声明。

最常见的是将范围映射到权限,或者您可以进行一些自定义配置以将范围映射到角色。

但是你已经决定编写一个自定义 JWTFilter,尽管 spring security 本质上已经内置了一个 JWTFilter,你可以自定义并且自 2018 年以来就拥有此功能。

通过编写自定义 JWTFilter,您基本上选择了退出可用的 Spring 安全功能,并且您无法利用像 .hasAuthority 这样的内置功能。

编写自定义安全通常被认为是不好的做法。

我建议你按照 Spring 安全参考手册How JWT Authentication Works in Spring Security 来实现 JWT 的处理。这可以通过启用oauth2resourceserver 和Override or Replace The Boot Auto Configuration 然后定义custom JWTDecoder 来完成。

完成后,您可以Extract Authorities Manually 并利用 Spring Security 的内置功能。

【讨论】:

以上是关于Spring Security 检查外部 JWT 角色的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security Jwt Token在请求表单角度时允许所有Options方法

在 Spring Security 中检查令牌的 NullPointerException

我可以使用 Spring Security @PreAuthorize 来检查 HTTP 标头吗?

Spring MVC 上的 JWT 注销

社交登录,spring-security-oauth2 和 spring-security-jwt?

前后端分离的Web应用程序中使用Spring Security+Mybatis+JWT非对称加密+动态权限管理:身份验证过滤器