Как гласит заголовок, я хочу сохранить / обновить дату последнего входа пользователя. Я использую 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 пользователя.
Как правильно сделать это? Это решение совсем не выглядит чистым.