Spring OAuth2 Security中如何在SuccessHandler登录后立即获取访问令牌?

时间:2020-09-18 03:28:39

标签: java spring spring-boot spring-security oauth-2.0

当前,我正在一个项目中,需要在登录后立即在Spring成功处理程序中收集需求 accessToken 。我阅读了不同的博客,但找不到任何可能的解决方案。在这里,我提供了我尝试过的代码段,

这是我尝试获取accessToken的成功处理程序。但是,当我尝试将 authentication.getDetails()强制转换为 OAuth2AuthenticationDetails 时,却出现异常。

@Component
public class AuthSuccessListener implements ApplicationListener<AuthenticationSuccessEvent> {
  
    @Override
    public void onApplicationEvent(AuthenticationSuccessEvent event) {
     
        UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
        System.out.println(userDetails);
        System.out.println("pass is " + userDetails.getPassword());
        System.out.println("username is " + userDetails.getUsername());

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
       //Authentication authentication = event.getAuthentication();


        OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
        String accessToken = details.getTokenValue();
        System.out.println(accessToken);
        
    }
}

我不知道这种方法是否有效。如果在SuccessHandler或其他位置登录后还有其他方法可以获取accessToken,请帮助解决此问题。

1 个答案:

答案 0 :(得分:0)

至少我找到了一种在登录后立即在succeshandler获取令牌的解决方案。简而言之,我还没有相关的解决方案,所以这就是我发布此答案的原因。我这样解决了这个问题。

    @Component
    public class AuthSuccessListener implements ApplicationListener<AuthenticationSuccessEvent> {
    
        private final TokenStore tokenStore;
    
        public AuthSuccessListener(TokenStore tokenStore) {
            this.tokenStore = tokenStore;
        }
    
        @Override
        public void onApplicationEvent(AuthenticationSuccessEvent event) {
            UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
            String accessToken = null;
            List<OAuth2AccessToken> tokens = (List<OAuth2AccessToken>) tokenStore.findTokensByClientIdAndUserName("your Client Id", userDetails.getUsername());
            if (tokens.size() > 0) {
                accessToken = tokens.get(0).getValue();
            }
        }
    }

在这里您可以看到我使用 TokenStore 来获取令牌,方法是将 clientId username 与方法tokenStore.findTokensByClientIdAndUserName("your Client Id", userDetails.getUsername());一起使用 就是这样。