当用户单击注销按钮时,我正在尝试将日志保存到数据库中。对于登录,我使用@Before...方法,而AOP正在执行此方法,并将记录保存到数据库中。
但是注销有一点不同,因为我没有特定的注销方法,相反,注销是由Spring Security处理的:
// ...
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/")
// ...为了在注销发生之前执行方法,最佳实践是什么?
谢谢,R。
发布于 2018-02-13 19:38:49
最后,我得到了一个使用实现LogoutSuccessHandler接口的CustomLogoutSuccessHandler来解决这个问题的解决方案,但是我不能使用它,因为当调用该方法时,Security Handler不能再访问用户信息,因为它是断开连接的。但是接口方法onLogoutSuccess附带了身份验证参数,我可以使用该参数在关闭http会话之前检索用户信息并将其存储到数据库中。
如果有任何其他解决方案,请回复。
谢谢R。
发布于 2019-02-14 18:50:53
使用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.");
}发布于 2018-02-13 19:51:51
您的方法很好,我已经显式地将spring安全注销成功url映射到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" />在控制器方法内部,你做你的审计工作。
https://stackoverflow.com/questions/48764755
复制相似问题