Я хочу реализовать LogoutSuccessHandler, который перенаправляет текущего пользователя на последнюю страницу ( referer ), но только если страница referer не защищена!
В настоящее время мой LogoutSuccessHandler перенаправляет пользователяна предыдущую страницу, может ли вышедший из системы пользователь получить доступ к этой странице или нет.Это иногда приводит к проблеме, когда пользователь получает прямое перенаправление на страницу входа.Если реферер указывает на защищенную страницу, пользователя следует перенаправить на страницу индекса / приветствия моего веб-приложения.
Моя текущая реализация выглядит следующим образом:
@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
String referer = request.getHeader("referer");
if (referer == null) {
referer = "/";
}
response.sendRedirect(refererUrl);
}
}
То, что я пробовал, но не работает:
@Component
public class MyLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler {
@Autowired
private WebInvocationPrivilegeEvaluator webInvocationPrivilegeEvaluator;
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
super.onLogoutSuccess(request, response, authentication);
String refererUrl = request.getHeader("referer");
if (webInvocationPrivilegeEvaluator.isAllowed(refererUrl, authentication)) {
response.sendRedirect(refererUrl);
} else {
response.sendRedirect(request.getContextPath());
}
}
Проблемы с этим подходом:
- webInvocationPrivilegeEvaluator имеет значение null
- Объект аутентификации по-прежнемуданные пользователя и контекст безопасности, несмотря на то, что пользователь вышел из системы.Я предположил, что объект аутентификации является нулевым или относится к анонимному пользователю.Так что даже # 1 не будет нулевым, мой подход все равно не будет работать, потому что объект аутентификации все еще содержит данные после выхода из системы, что означает, что пользователь будет перенаправлен на защищенную страницу, а затем прямо на страницу входа.
Так кто-нибудь знает, как достичь моей цели?