如何使用OAuth2获取Spring的自定义Principal对象?

时间:2016-09-26 00:02:55

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

我有一个使用spring-security-jwt和spring-security-oath2的Spring Boot应用程序。我有一个自定义User对象扩展UserDetails和一个Custom UserDetailsS​​ervice从loadUserByUsername方法返回此对象。

但是当我利用Authentication对象的getPrincipal方法并尝试Cast到我的自定义用户对象时,它会因为主体返回字符串vs我的自定义用户对象而失败。

我的实际目标是在需要最多自定义对象详细信息的每个方法调用上消除持久层的行程。

1 个答案:

答案 0 :(得分:1)

您可以通过将AccessTokenConverter(间接保留UserDetailsService)设置为JwtAccessTokenConverter来执行此操作。请参阅accessTokenConverter()方法。

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    // Other configurations omitted

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore())
                .accessTokenConverter(accessTokenConverter())
                .tokenEnhancer(accessTokenConverter())
                .authenticationManager(authenticationManager);
    }

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        DefaultUserAuthenticationConverter duac = new DefaultUserAuthenticationConverter();
        duac.setUserDetailsService(userDetailsService);

        DefaultAccessTokenConverter datc = new DefaultAccessTokenConverter();
        datc.setUserTokenConverter(duac);

        JwtAccessTokenConverter jatc = new JwtAccessTokenConverter();
        jatc.setAccessTokenConverter(datc); // IMPORTANT
        jatc.setSigningKey("your-signing-key");
        return jatc;
    }

    @Bean
    public DefaultTokenServices tokenServices() {
        DefaultTokenServices tokenServices = new DefaultTokenServices();
        tokenServices.setTokenStore(tokenStore());
        tokenServices.setSupportRefreshToken(true);
        return tokenServices;
    }
}