Как перенаправить метод на вход/выход из системы до того, как целевой URL-адрес вызван в spring -security, spring mvc
Я пытаюсь записать текущее время входа (в методе или объекте) после успешного входа в систему и назначить время LastLogin текущему времени входа в систему при выходе из системы. Я использую spring для входа в систему, выхода из системы. Но я не знаю, как взять управление методу, прежде чем он перейдет к целевому URL.
SPRING -SECURITY.XML -
<security:form-login login-page="/login" login-processing-url="/home/currentTime" authentication-failure-url="/login?error=true" default-target-url="/home"/>
<security:logout invalidate-session="true"
logout-success-url="/home/copyLastloginToCurrentLoginTime" logout-url="/logout" />
CONTROLLER -/home -
@RequestMapping(value = "/currentTime", method = RequestMethod.GET)
public void recordCurrentLoginTime(Model model) { //code to record current time }
@RequestMapping(value = "/copyLastloginToCurrentLoginTime", method = RequestMethod.GET)
public void changeLastLoginTime(Model model) {//code to copy current to last time }
ПРОБЛЕМА -
Я получаю Error 404 для - project-title/j_spring_security_check URL. и когда я пытаюсь отлаживать, он вообще не входит в методы контроллера. Должен ли я использовать некоторые фильтры или что-то еще для этой цели?
Я видел SpringSecurity: всегда перенаправлял пользователя на страницу и Как обрабатывать вход в форму с помощью spring Безопасность /spring MVC. Но я не мог достичь своей цели.
Я новичок в безопасности spring, и мне нужна помощь, чтобы двигаться в правильном направлении.
Ответы
Ответ 1
Напишите свой собственный AuthenticationSuccessHandler и LogoutSuccessHandler.
Пример:
spring -security.xml:
<security:form-login login-page="/login"
login-processing-url="/login_check"
authentication-failure-url="/login?error=true"
authentication-success-handler-ref="myAuthenticationSuccessHandler"
/>
<security:logout
logout-url="/logout"
success-handler-ref="myLogoutSuccessHandler"
/>
AuthenticationSuccessHandler
@Component
public class MyAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
@Autowired
private UserService userService;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
// changeLastLoginTime(username)
userService.changeLastLoginTime(authentication.getName());
setDefaultTargetUrl("/home");
super.onAuthenticationSuccess(request, response, authentication);
}
}
LogoutSuccessHandler
@Component
public class MyLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
if (authentication != null) {
// do something
}
setDefaultTargetUrl("/login");
super.onLogoutSuccess(request, response, authentication);
}
}
Ответ 2
Вы можете сопоставить целевой URL-адрес по умолчанию в своем сопоставлении, например
<security:form-login login-page="/login"
login-processing-url="/login_check"
authentication-failure-url="/login?error=true"
default-target-url = "/welcome"
authentication-success-handler-ref="myAuthenticationSuccessHandler"/>
Когда пользователь аутентифицируется, это время, когда пользователь обратился к вашей системе. Сделайте обновление через DAO в таблице пользователя с текущей датой и временем.
Простой процесс, и вы закончили