首页 文章

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

提问于
浏览
3

我有一个Spring Boot应用程序,它使用spring-security-jwt和spring-security-oath2 . 我有一个自定义User对象扩展UserDetails和一个Custom UserDetailsService从loadUserByUsername方法返回此对象 .

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

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

1 回答

  • 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;
        }
    }
    

相关问题