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" />

Внутри контроллера вы проводите аудит.

Другие вопросы по тегам