如标题所述,我要保存/更新用户的上次登录日期。我在同一应用中将Spring Security oauth2 JWT与AuthorizationServer / ResourceServer一起使用。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>1.0.10.RELEASE</version>
</dependency>
这是我目前的做法:
@EventListener
public void authSuccessEventListener(AuthenticationSuccessEvent authorizedEvent){
Authentication authentication = authorizedEvent.getAuthentication();
if (authentication instanceof UsernamePasswordAuthenticationToken && authentication.getPrincipal() instanceof SecurityUserDetails) {
// save last login date
GenericUser genericUser = repositoryService.findByEmail(authentication.getName());
genericUser.setLastLoginDate(Instant.now());
repositoryService.save(genericUser);
}
}
此时尚未完全填充SecurityContext,SecurityContextHolder.getContext().getAuthentication()
返回客户端应用程序的Authentication对象。如果您正在执行数据库审核,这是一个问题。
AuthenticationSuccessEvent在我每次登录或访问受JWT令牌保护的资源时触发。更准确地说,它在成功登录/ login时触发两次,一次触发客户端应用程序身份验证,一次触发用户身份验证。 需要进行if()检查以区分客户端应用程序身份验证和用户身份验证,以及用户密码访问和用户JWT访问。
执行此操作的正确方法是什么?这种解决方案看起来一点也不干净。