我有一个富Web(基于响应的)前端应用程序,它将请求发送到后端ResourceServer应用程序。请求与JWT一起在标头中发送以进行身份验证。我的设置对Okta授权服务器进行身份验证,并从单独的服务中检索组/权限。
我将后端服务器设置为带有Spring Security Oauth2资源服务器的@EnableResourceServer
@Configuration
@EnableResourceServer
public class SecurityConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception{
http.requestMatchers().antMatchers("/api/**")
.and()
.authorizeRequests().anyRequest().authenticated();
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenServices(tokenServices()).resourceId("my-okta-resource-server-client-id");
}
@Bean
@Primary
public DefaultTokenServices tokenServices() throws Exception {
DefaultTokenServices tokenServices = new DefaultTokenServices();
tokenServices.setTokenStore(tokenStore());
return tokenServices;
}
@Bean
public TokenStore tokenStore() throws Exception {
return new JwkTokenStore("https://my-org.oktapreview.com/oauth2/my-auth-server/v1/keys");
}
通过此设置,我可以使用JWT
实现验证JwkTokenStore
令牌(它在内部使用JwkVerifyingJwtAccessTokenConverter
从提供的密钥验证Json Web Keyset)。但是我无法将其配置为
Authentication
。它只查看user_name声明,我想在那里使用电子邮件或其他声明。DefaultUserAuthenticationConverter
的{{1}}深深嵌入其中。这需要查找用户在单独的休息服务中设置的权限。 Spring-security-oauth2的JWK相关实现似乎已关闭,大多数UserDetailsService
验证相关类都不公开。
什么是利用JWKs
提供的令牌验证的好方法,也可以在那里拥有您自己的用户详细信息以加载权限。
正在使用的软件版本: Springboot 1.5.2.RELEASE,spring-security-core:4.2.3,spring-security-oauth2:2.0.14,
答案 0 :(得分:3)
您应该使用所谓的{% if profile.location %}{% else %}
<p>Finish Building Your Profile</p>
{% endif %}
提取这些额外的声明,并将其添加到DefaultAccessTokenConverter
对象中。
您可以OAuth2Authentication
@Autowire
进入CustomAccessTokenConverter
类,然后将其设置为ResourceServerConfiguration
配置。
ResourceServerConfiguration:
JwtTokenStore()
可以配置CustomAccessTokenConverter,以便在此处提取自定义声明。
CustomAccessTokenConverter:
@Autowired
private CustomAccessTokenConverter yourCustomAccessTokenConverter;
@Override
public void configure(final ResourceServerSecurityConfigurer config) {
config.tokenServices(tokenServices()).resourceId(resourceId);
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(jwkTokenStore());
return defaultTokenServices;
}
@Bean
public TokenStore jwtTokenStore() throws Exception {
return new JwkTokenStore("https://my-org.oktapreview.com/oauth2/my-auth-server/v1/keys", accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setAccessTokenConverter(yourCustomAccessTokenConverter);
return converter;
}
之后,您应该可以通过@Component
public class CustomAccessTokenConverter extends DefaultAccessTokenConverter {
@Override
public OAuth2Authentication extractAuthentication(Map<String, ?> claims) {
OAuth2Authentication authentication = super.extractAuthentication(claims);
authentication.setDetails(claims);
return authentication;
}
}
对象访问声明。