首页 > 解决方案 > 如何防止调用 ApplicationListener在使用 oauth2 在 Spring Security 中的每次 api 调用之后?

问题描述

我当前的项目中有一个要求,我需要在验证用户后通过调用/oauth/token. 所以我写了一个这样的类

@Component
public class AuthSuccessListener implements ApplicationListener<AuthenticationSuccessEvent> {

  @Value("${ationet.auth.url}")
  private String ationetUrl;

  private final TokenStore tokenStore;
  private final RestTemplate restTemplate;
  private final AtionetService ationetService;

  public AuthSuccessListener(
      TokenStore tokenStore, RestTemplate restTemplate, AtionetService ationetService) {
    this.tokenStore = tokenStore;
    this.restTemplate = restTemplate;
    this.ationetService = ationetService;
  }

  @Override
  public void onApplicationEvent(AuthenticationSuccessEvent event) {
    RedisService<String> redisService = new RedisService<>();
    String bespokeAccessToken = null;
    String ationetAccessToken = null;

    UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
    List<OAuth2AccessToken> tokens =
        (List<OAuth2AccessToken>)
            tokenStore.findTokensByClientIdAndUserName("unipet", userDetails.getUsername());
    bespokeAccessToken =
        tokens.stream()
            .filter(Objects::nonNull)
            .findFirst()
            .map(OAuth2AccessToken::getValue)
            .orElse(null);

    try {
      String ationetAccesstoken =
          ationetService.getAccessToken("abc@gmail.com", "password");
      if (ationetAccesstoken != null) {
        redisService.setValue(bespokeAccessToken, ationetAccessToken);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

但问题是每次 api 调用后都会调用此方法。结果 api 响应变慢了,每次 api 调用后,同样的事情一次又一次地发生。所以我的要求是我想在验证用户身份后执行一次此操作,而不是在每次 api 调用之后。任何建议将不胜感激。

标签: springspring-bootspring-securityoauth-2.0microservices

解决方案


可以添加判断条件。

if (event.getSource().getClass().getName().equals("org.springframework.security.authentication.UsernamePasswordAuthenticationToken"))

推荐阅读