Я использую безопасность Spring для обеспечения Запросов HTTP к веб-сайту. Основное использование для обеспечения страниц, таким образом, что пользователь перенаправляется к странице входа в систему при попытке получить доступ к тем страницам.
Однако у меня есть дальнейшее требование. В моей модели я могу отметить пароль пользователя, как являющийся временным таким образом, что, когда они успешно входят в систему, они должны быть автоматически вынуждены изменить свой пароль. После того как пароль изменяется, они должны затем быть переданы на странице, к которой они первоначально пытались получить доступ.
Кто-либо использовал безопасность Spring с этой целью? Я должен создать свой собственный фильтр?
Спасибо,
Andrew
В Spring Security 3.0 вы можете реализовать собственный AuthenticationSuccessHandler
.
В этом обработчике вы можете перенаправить пользователя с временным паролем на страницу изменения пароля вместо первоначально запрошенной страницы. После изменения пароля вы можете перенаправить пользователя на первоначально запрошенную страницу, используя SavedRequestAwareAuthenticationSuccessHandler
, который является реализацией обработчика по умолчанию.
public class MyHandler implements AuthenticationSuccessHandler {
private AuthenticationSuccessHandler target = new SavedRequestAwareAuthenticationSuccessHandler();
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication auth) {
if (hasTemporaryPassword(auth)) {
response.sendRedirect("/changePassword");
} else {
target.onAuthenticationSuccess(request, response, auth);
}
}
public void proceed(HttpServletRequest request,
HttpServletResponse response, Authentication auth) {
target.onAuthenticationSuccess(request, response, auth);
}
}
@Controller("/changePassword")
public class ChangePasswordController {
@Autowired
private MyHandler handler;
@RequestMapping(method = POST)
public void changePassword(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(name = "newPassword") String newPassword) {
// handle password change
...
// proceed to the secured page
handler.proceed(request, response, auth);
}
// form display method, etc
...
}
Да, я сделал это с помощью фильтра ForceChangePasswordFilter. Потому что, если пользователь вводит URL-адрес вручную, он может обойти форму изменения пароля. С фильтром запросы всегда перехватываются.