Spring AOP Spring Security
Я пытаюсь сохранить журнал в базе данных, когда пользователь нажимает кнопку выхода из системы. Для входа в систему я использую метод @Before..., и AOP выполняет этот метод и сохраняет запись в базе данных.
Но выход из системы немного отличается, потому что у меня нет определенного метода выхода из системы, вместо этого он обрабатывается Spring Security:
// ...
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/")
// ...
Какова наилучшая практика для выполнения метода до выхода из системы?
Спасибо, Р.
2 ответа
Наконец, я получил решение этой проблемы, используя CustomLogoutSuccessHandler, реализующий интерфейс LogoutSuccessHandler, но я не смог использовать AOP, потому что при вызове метода обработчик безопасности больше не может получить доступ к пользовательской информации, потому что отключен. Но интерфейсный метод onLogoutSuccess шел с параметром Authentication, который я мог использовать, чтобы получить информацию о пользователе и сохранить ее в базе данных, прежде чем закрыть сеанс http.
Если есть какие-либо другие решения, пожалуйста, ответьте.
Спасибо Р.
С Spring AOP вы можете сделать это следующим образом:
@Before("execution(* org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler.logout(..))")
public void beforeLogout(JoinPoint joinPoint) throws Throwable {
System.out.println(
">>> Aspect : User " + SecurityContextHolder.getContext().getAuthentication().getName() + " successfully logged out.");
}
Ваш подход хорош, я явно сопоставил URL-адрес успешного выхода из системы безопасности Spring для контроллера Spring, как показано ниже:
@RequestMapping(value="/logout", method = RequestMethod.GET)
public String logoutPage (HttpServletRequest request, HttpServletResponse response) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null){
new SecurityContextLogoutHandler().logout(request, response, auth);
}
return "redirect:/login?logout";//You can redirect wherever you want, but generally it's a good practice to show login screen again.
}
<logout
logout-success-url="/logout"
delete-cookies="JSESSIONID" />
Внутри контроллера вы проводите аудит.