JWT 中不存在的角色应该在哪里添加到身份验证对象?
Where should roles not existing in a JWT be added to an Authentication object?
我们有一个 Spring 引导服务器,它使用 JWT 令牌对用户进行身份验证。应根据用户的身份为其分配角色。
授予token的服务器并不知道用户在每个系统中应该有什么角色,所以每个系统应该根据用户的身份来授予角色。
类似于:
- 验证用户。
- (用户已通过身份验证)查找用户具有哪些角色并添加到安全上下文中的身份验证。
- 检查角色。例如,
@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
我们有一个 Spring 引导服务器,它使用 JWT 令牌对用户进行身份验证。应根据用户的身份为其分配角色。
授予token的服务器并不知道用户在每个系统中应该有什么角色,所以每个系统应该根据用户的身份来授予角色。
类似于:
- 验证用户。
- (用户已通过身份验证)查找用户具有哪些角色并添加到安全上下文中的身份验证。
- 检查角色。例如,
@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