JWT 中不存在的角色应该在哪里添加到身份验证对象?

Where should roles not existing in a JWT be added to an Authentication object?

我们有一个 Spring 引导服务器,它使用 JWT 令牌对用户进行身份验证。应根据用户的身份为其分配角色。

授予token的服务器并不知道用户在每个系统中应该有什么角色,所以每个系统应该根据用户的身份来授予角色。

类似于:

  1. 验证用户。
  2. (用户已通过身份验证)查找用户具有哪些角色并添加到安全上下文中的身份验证。
  3. 检查角色。例如,@PreAuthorize(hasRole('some_role'))

我的问题是:

我应该怎么做?或者,我是否应该不这样做并以其他方式处理这种情况?

我找到了一种使用自定义 jwtAuthenticationConverter 的方法。

  http
            ...
            ?.oauth2ResourceServer()
            ?.jwt()
            ?.jwtAuthenticationConverter(customConverter)
@Component
class CustomConverter(
    private val jwtGrantedAuthoritiesConverter: JwtGrantedAuthoritiesConverter
) : Converter<Jwt, AbstractAuthenticationToken> {

    override fun convert(jwt: Jwt): AbstractAuthenticationToken {
      // Custom logic that adds roles
    }
}

如前所述,JwtAuthenticationConverter 是预期的配置点。

Spring 安全人员会将其作为 @Bean:

@Bean
JwtAuthenticationConverter jwtAuthenticationConverter() {
    JwtAuthenticationConverter converter =
        new JwtAuthenticationConverter();
    converter.setJwtGrantedAuthoritiesConverter(...);
    return converter;
}

正如另一个答案中已经指出的,您也可以在 DSL 上设置一个。

您可以在参考中阅读更多内容:https://docs.spring.io/spring-security/site/docs/5.4.4/reference/html5/#oauth2resourceserver-jwt-authorization-extraction