目前,我正在处理一个项目,该项目的需求是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());
来复述令牌就是这样。