Spring security Spring Security OAuth2 JWT保存上次登录日期

Spring 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

正如标题所述,我想保存/更新用户的上次登录日期。我在同一个应用程序中使用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>
此时未完全填充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);
    }
}