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

时间:2020-03-18 17:36:45

标签: spring-security spring-security-oauth2

如标题所述,我要保存/更新用户的上次登录日期。我在同一应用中将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访问。

执行此操作的正确方法是什么?这种解决方案看起来一点也不干净。

0 个答案:

没有答案