如何使用Spring Oauth2将UserDetails附加到从JWT令牌接收的Principal

时间:2015-10-08 15:40:44

标签: java spring oauth spring-security-oauth2

我有这些服务

  • 使用JDBC提供程序(DB-1)的oauth2身份验证服务器
  • 支持Zuul的Web应用程序,代理对authserver和资源服务器的请求
  • 启用@ EnableOauth2Resource(DB-2)
  • 的资源

我需要使用从DB-1收到的凭据从DB-2获取资源服务器中的用户详细信息,并将启用的权限设置为当前的Principal,以便进一步使用@RreAuthorize @RolesAllowed注释。

在使用oauth2令牌成功验证后,是否有一些钩子可以替换或更新org.springframework.security.oauth2.provider.OAuth2Authentication?

2 个答案:

答案 0 :(得分:3)

我通过将资源服务器配置为..来获取资源服务器上的主体。

@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {


    public ResourceServerConfiguration() {
        super();
    }


    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
    }

    /* returns org.springframework.security.core.userdetails.UserDetailsService */
    @Bean
    UserDetailsService customUserDetailsService () {
        return new CustomUserDetailsService();
    }

    @Bean
    public UserAuthenticationConverter userAuthenticationConverter () {
        DefaultUserAuthenticationConverter defaultUAC = new DefaultUserAuthenticationConverter();
        defaultUAC.setUserDetailsService(customUserDetailsService());
        return defaultUAC;
    }

    @Bean
    public AccessTokenConverter accessTokenConverter() {
        DefaultAccessTokenConverter defaultATC = new DefaultAccessTokenConverter();
        defaultATC.setUserTokenConverter(userAuthenticationConverter());
        return defaultATC;
    }

    @Bean
    RemoteTokenServices getRemoteTokenServices () {
        RemoteTokenServices rts = new RemoteTokenServices();
rts.setCheckTokenEndpointUrl("http://localhost:9999/uaa/oauth/check_token");
        rts.setAccessTokenConverter(accessTokenConverter());
        rts.setClientId("yourClientID");
        rts.setClientSecret("yourClientSecret");
        return rts;
    }
    ...

}

基本上我们通过从accesstoken获取身份验证信息来使用customUserDetailsS​​ervice更新资源服务器上的身份验证主体。 RemoteTokenServices查询auth-server的/check_token端点以获取访问令牌的内容。如果端点返回400响应,则表示令牌无效。

答案 1 :(得分:2)

如果使用Spring Boot并且您可以以标准方式获取用户详细信息,请首先查看customizing user information上的Spring Boot文档。

如果您需要进一步控制,我建议您提供一个ResourceServerConfigurer来提供自定义ResourceServerTokenServices,它可以使用您需要的主要详细信息填充您的OAuth2Authentication。

ResourceServerTokenServices由OAuth2AuthenticationManager或OAuth2ClientAuthenticationProcessingFilter传递给accessToken,并期望返回填充的OAuth2Authentication。这使您有机会获取主体信息并将其填充到OAuth2Authentication对象中。

同样,如果使用Spring Boot,ResourceServerConfigurer(如果实例化为bean)将被OAuth2自动配置选中,并且您的ResourceServerTokenServices将被注册。

@Configuration
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Autowired
    private MyResourceServerTokenServices tokenServices;

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.tokenServices(tokenServices);
    }
}

覆盖

@Override
public OAuth2Authentication loadAuthentication(String accessToken) {
    // fetch user information and return populated authentication
}