Spring Security OAuth2 JWT сохранить дату последнего входа - PullRequest
1 голос
/ 18 марта 2020

Как гласит заголовок, я хочу сохранить / обновить дату последнего входа пользователя. Я использую 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() возвращает объект аутентификации клиентского приложения. Это проблема, если вы выполняете аудит базы данных.

AuthenticationSuccessEvent срабатывает каждый раз, когда я вхожу в систему или обращаюсь к ресурсу, защищенному токеном JWT. Чтобы быть более точным, он запускается дважды при успешном входе в систему, один раз для аутентификации клиентского приложения и один раз для аутентификации пользователя. Проверки if () необходимы для проведения различия между аутентификацией клиентского приложения и аутентификацией пользователя, а также между доступом по паролю пользователя и доступом JWT пользователя.

Как правильно сделать это? Это решение совсем не выглядит чистым.

...