spring - 如何防止调用 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 调用之后。任何建议将不胜感激。
解决方案
可以添加判断条件。
if (event.getSource().getClass().getName().equals("org.springframework.security.authentication.UsernamePasswordAuthenticationToken"))
推荐阅读
- node.js - 回调问题设置变量节点
- python - 流程重复 3 次后响应异常
- ruby-on-rails - Rails Devise_token_auth invalid_credentials: OAuth2::Error
- java - 春季批处理作业未读取第一行
- java - 使用 EventBus 时处理 Vert.x NetSocket writeQueueFull
- javascript - TypeScript 返回不可变/常量/只读数组
- python - Jira POST & PUT Rest 调用从 Python 返回错误 400
- julia - 在 Julia-Lang 中包含文件以考虑更新的正确方法
- c++ - 抛出异常:读取访问冲突。我的代码有什么问题?
- powershell - 根据唯一属性将数组拆分为单独的对象