Spring security Spring Security OAuth2 JWT保存上次登录日期
正如标题所述,我想保存/更新用户的上次登录日期。我在同一个应用程序中使用spring security oauth2 JWT和AuthorizationServer/ResourceServerSpring security Spring Security OAuth2 JWT保存上次登录日期,spring-security,spring-security-oauth2,Spring Security,Spring Security Oauth2,正如标题所述,我想保存/更新用户的上次登录日期。我在同一个应用程序中使用spring security oauth2 JWT和AuthorizationServer/ResourceServer <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifa
<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>
此时未完全填充SecurityContext,SecurityContextHolder.getContext().getAuthentication()
返回客户端应用程序的身份验证对象。如果您正在执行数据库审核,这是一个问题
每当我登录或访问受JWT令牌保护的资源时,AuthenticationSuccessEvent都会触发。更准确地说,它在成功/登录时触发两次,一次用于客户端应用程序身份验证,一次用于用户身份验证。
需要使用if()检查来区分客户端应用程序身份验证和用户身份验证,以及用户密码访问和用户JWT访问
正确的方法是什么?这个解决方案看起来一点也不干净
@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);
}
}