Создайте приложение Spring mvc, которое перенаправляет каждый запрос обратно на предыдущий URL-адрес после аутентификации

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
371
4

Ответы 4

Вероятно, у вас есть какой-то фильтр, который проверяет, аутентифицирован ли пользователь, и перенаправляет на страницу входа. Получите URL-адрес запроса в этом фильтре и добавьте его на страницу входа в качестве параметра. При успешном входе в систему проверьте этот параметр и присутствует ли перенаправление. В противном случае перенаправьте на домашнюю страницу. Вуаля

Для этого вы можете использовать файлы cookie. Итак, в основном, с какой страницы не удалось выполнить аутентификацию, вы можете сохранить их в cookie, а после аутентификации вы можете перенаправить на этот предыдущий URL-адрес.

Кроме того, вы тоже можете это сделать.

http://www.baeldung.com/spring_redirect_after_login

Для этого вы можете использовать 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;
    }
}

Наиболее распространенные способы реализации логики перенаправления после входа в систему:

  • с использованием заголовка HTTP Referer

  • сохранение исходного запроса в сеансе

  • добавление исходного URL-адреса к перенаправленному URL-адресу входа

    в статьях это и это вы можете увидеть более подробную информацию о весенней безопасности:

Другие вопросы по теме