spring-security-oauth2 JwkTokenStore具有自定义用户详细信息服务

时间:2017-07-06 21:05:04

标签: authentication spring-boot spring-security spring-security-oauth2 okta

我有一个富Web(基于响应的)前端应用程序,它将请求发送到后端ResourceServer应用程序。请求与JWT一起在标头中发送以进行身份​​验证。我的设置对Okta授权服务器进行身份验证,并从单独的服务中检索组/权限。

我将后端服务器设置为带有Spring Security Oauth2资源服务器的@EnableResourceServer

的Springboot应用程序
@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)。但是我无法将其配置为

  1. 提取具体的JWT声明以创建Authentication。它只查看user_name声明,我想在那里使用电子邮件或其他声明。
  2. 注入自定义用户详细信息服务。封装DefaultUserAuthenticationConverter的{​​{1}}深深嵌入其中。这需要查找用户在单独的休息服务中设置的权限。
  3. Spring-security-oauth2的JWK相关实现似乎已关闭,大多数UserDetailsService验证相关类都不公开。 什么是利用JWKs提供的令牌验证的好方法,也可以在那里拥有您自己的用户详细信息以加载权限。

    正在使用的软件版本: Springboot 1.5.2.RELEASE,spring-security-core:4.2.3,spring-security-oauth2:2.0.14,

1 个答案:

答案 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; } } 对象访问声明。