Я сделал простое аутентифицированное приложение, у которого был недостаток: всякий раз, когда кто-либо пытается перейти по защищенной ссылке, такой как «https://www.example.com/orders.spr», он перенаправляет пользователя на страницу входа для аутентификации, но после аутентификации пользователь будет перенаправлен на домашнюю страницу. Как сделать следующее приложение настолько надежным, чтобы пользователь оставался на том же URL-адресе после аутентификации? Мне нужно знать, как поймать анонимных пользователей в весенней безопасности, как перенаправить пользователя на ту же страницу после аутентификации и как увеличить тайм-аут сеанса до 1 часа, чтобы пользователь мог получить доступ к URL-адресу в заданное время. Любой пример, учебник или код прилагаются. Заранее спасибо.




Вероятно, у вас есть какой-то фильтр, который проверяет, аутентифицирован ли пользователь, и перенаправляет на страницу входа. Получите URL-адрес запроса в этом фильтре и добавьте его на страницу входа в качестве параметра. При успешном входе в систему проверьте этот параметр и присутствует ли перенаправление. В противном случае перенаправьте на домашнюю страницу. Вуаля
Для этого вы можете использовать файлы cookie. Итак, в основном, с какой страницы не удалось выполнить аутентификацию, вы можете сохранить их в cookie, а после аутентификации вы можете перенаправить на этот предыдущий URL-адрес.
Кроме того, вы тоже можете это сделать.
Для этого вы можете использовать SavedRequestAwareAuthenticationSuccessHandler в качестве обработчика успешной аутентификации.
На странице api doc мы можем найти следующее описание:
An authentication success strategy which can make use of the DefaultSavedRequest which may have been stored in the session by the ExceptionTranslationFilter. When such a request is intercepted and requires authentication, the request data is stored to record the original destination before the authentication process commenced, and to allow the request to be reconstructed when a redirect to the same URL occurs. This class is responsible for performing the redirect to the original URL if appropriate.
Ключевой момент - данные запроса сохраняются для записи исходного пункта назначения до начала процесса аутентификации и для обеспечения возможности восстановления запроса, когда происходит перенаправление на тот же URL.
Я использовал этот успех в своем проекте, и вы можете попробовать, чтобы использовать его, вам нужно расширить его, как показано ниже:
public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler{
@Override
public void onAuthenticationSuccess(HttpServletRequest request,HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
//...other code
super.onAuthenticationSuccess(request, response, authentication);
}
}
Spring Security предоставляет компонент, который несет прямую ответственность за принятие решения о том, что делать после успешной аутентификации, - AuthenticationSuccessHandler:
возможно, приведенный ниже код может помочь вам понять поток задач:
public class MySimpleUrlAuthenticationSuccessHandler
implements AuthenticationSuccessHandler {
protected Log logger = LogFactory.getLog(this.getClass());
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws IOException {
handle(request, response, authentication);
clearAuthenticationAttributes(request);
}
protected void handle(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws IOException {
String targetUrl = determineTargetUrl(authentication);
if (response.isCommitted()) {
logger.debug(
"Response has already been committed. Unable to redirect to "
+ targetUrl);
return;
}
redirectStrategy.sendRedirect(request, response, targetUrl);
}
protected String determineTargetUrl(Authentication authentication) {
boolean isUser = false;
boolean isAdmin = false;
Collection<? extends GrantedAuthority> authorities
= authentication.getAuthorities();
for (GrantedAuthority grantedAuthority : authorities) {
if (grantedAuthority.getAuthority().equals("ROLE_USER")) {
isUser = true;
break;
} else if (grantedAuthority.getAuthority().equals("ROLE_ADMIN")) {
isAdmin = true;
break;
}
}
if (isUser) {
return "/homepage.html";
} else if (isAdmin) {
return "/console.html";
} else {
throw new IllegalStateException();
}
}
protected void clearAuthenticationAttributes(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session == null) {
return;
}
session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
}
public void setRedirectStrategy(RedirectStrategy redirectStrategy) {
this.redirectStrategy = redirectStrategy;
}
protected RedirectStrategy getRedirectStrategy() {
return redirectStrategy;
}
}
Наиболее распространенные способы реализации логики перенаправления после входа в систему: