в моем приложении у меня есть класс Account
, который также реализует UserDetails
. Я также создал класс MyAuthenticaionSuccessHandler
, который расширяет SimpleUrlAuthenticationSuccessHandler
. Я хочу изменить поле dateLastLogin
на Account
после входа пользователя в систему. В методе onAuthenticationSuccess
мне нужен экземпляр AccountService
, в котором существует метод save(Account account)
, чтобы сохранить обновленный Account
в db. Проблема начинается здесь. Я не могу выполнить внедрение поля, потому что мне нужно инициализировать экземпляр AccountService
в конструкторе. Я не могу этого сделать, потому что тогда я не смогу создать экземпляр MyAuthenticaionSuccessHandler
. Я тоже не могу создать его вручную. Экземпляры других классов, таких как службы или контроллеры, в которых экземпляры других классов службы / репозитория создаются автоматически, поэтому там это работает. Но как заставить его работать для пользовательского обработчика успешной аутентификации?
Вот фрагменты моего кода:
Часть класса, расширяющая WebSecurityConfigureAdapter
// ...
.formLogin()
.loginPage("/guest/login")
.permitAll()
.failureHandler(new MyAuthenticationFailureHandler("/guest/login"))
.successHandler(new MyAuthenticationSuccessHandler("/user/overview"))
.and()
.logout()
// ...
Часть AccountService
@Service
@Transactional
public class AccountService implements UserDetailsService {
private final AccountRepository accountRepository;
private final ActivationCodeService activationCodeService;
public AccountService(AccountRepository accountRepository, ActivationCodeService activationCodeService) {
this.accountRepository = accountRepository;
this.activationCodeService = activationCodeService;
}
public void saveAccount(Account account){
accountRepository.save(account);
}
// ...
И мой собственный обработчик успешной аутентификации
public class MyAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
private final AccountService accountService; // <-- here it doesn't work
public MyAuthenticationSuccessHandler() {
}
public MyAuthenticationSuccessHandler(String defaultTargetUrl) {
super(defaultTargetUrl);
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
super.onAuthenticationSuccess(request, response, authentication);
Account account = (Account)authentication.getPrincipal();
account.setDateLastLogin(new Date());
accountService.saveAccount(account);
}
}