如何在spring-oauth2安全中的successHandler中登录后立即获取访问令牌



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

这是我尝试获取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,那么请帮助解决此问题。

至少我在登录后就找到了在successshandler获取令牌的解决方案。由于我还没有相关的解决方案,所以我发布了这个答案。我就这样解决了这个问题。

@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通过使用客户端ID用户名方法tokenStore.findTokensByClientIdAndUserName("your Client Id", userDetails.getUsername());来复述令牌就是这样。

最新更新