Spring security Spring OAuth2资源服务器-SecurityContextHolder中未反映用户名属性
我在JWT中有一个名为Spring security Spring OAuth2资源服务器-SecurityContextHolder中未反映用户名属性,spring-security,spring-security-oauth2,Spring Security,Spring Security Oauth2,我在JWT中有一个名为user\u name的声明,并且在spring security oauth2客户端提供程序专有属性中将相应的user name属性设置为user\u name: spring.security.oauth2.client.provider.my oauth provider.user name属性=user\u name 我还可以看到,ReactiveClientRegistrationRepository类(ClientRegistration.ProviderDet
user\u name
的声明,并且在spring security oauth2客户端提供程序专有属性中将相应的user name属性设置为user\u name
:
spring.security.oauth2.client.provider.my oauth provider.user name属性=user\u name
我还可以看到,ReactiveClientRegistrationRepository
类(ClientRegistration.ProviderDetails.UserInfoEndpoint
)正在正确读取此属性。但是当我在资源服务器上读取SecurityContextHolder.getContext().getAuthentication().getName()
时,我可以看到从(默认)sub
-IdTokenClaimNames.sub
声明中获取的值
为什么呢?我是否仍然错过了资源服务器端的一些附加配置,以指定由资源服务器上的
SecurityContextHolder.getContext().getAuthentication().getName()
获取并返回的user name属性?我知道只有承载令牌(可能还有一些cookie)正在从客户端发送到资源服务器,因此网关/客户端可能还需要一些其他过滤器-只是猜测?原因是您使用的是一个前缀为security.oauth2.client
的属性,该属性适用于OAuth 2.0客户端
在SpringSecurity5.2.x中,没有SpringBoot属性来指示资源服务器的用户名属性,例如Security.oauth2.resourceserver.xyz
您可以将自己的转换器发布到DSL,不过:
JwtAuthenticationConverter=新的JwtAuthenticationConverter();
http
.oauth2ResourceServer()
.jwtAuthenticationConverter(jwt->{
JwtAuthenticationToken authentication=converter.convert(jwt);
返回新的JwtAuthenticationToken(authentication.getToken(),
authentication.getAuthories(),jwt.getClaim(“claim”);
});
感谢您的回答-刚刚在JwtAuthenticationToken
中添加了强制转换,效果很好。关于这个问题,我添加了更多的想法,主要围绕着在resourceserver端同时具有spring.security.oauth2.resourceserver.jwt.user name属性的想法,因此它会在客户端和资源服务器端自动进行增强,具有某种一致性。再次感谢!