Рубрики
Без рубрики

Перенаправление зарегистрированных пользователей с помощью Spring Security

Узнайте несколько способов перенаправления зарегистрированных пользователей со страницы входа в систему с помощью Spring Security.

Автор оригинала: baeldung.

1. Обзор

Обычно веб-сайты не позволяют своим пользователям заходить в систему, когда они уже вошли в систему. Распространенный способ сделать это-перенаправить пользователя на другую страницу, обычно являющуюся отправной точкой приложения после входа в систему.

В этом уроке мы рассмотрим несколько способов реализации этого решения с помощью Spring Security.

Кроме того, чтобы узнать больше о том, как мы можем быстро реализовать вход в систему, мы можем начать с этой статьи .

2. Проверка подлинности

Во-первых, нам понадобится метод проверки подлинности.

Другими словами, нам нужно будет получить данные аутентификации из Контекста безопасности и проверить, вошел ли пользователь в систему :

private boolean isAuthenticated() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication == null || AnonymousAuthenticationToken.class.
      isAssignableFrom(authentication.getClass())) {
        return false;
    }
    return authentication.isAuthenticated();
}

Мы будем использовать это во всех следующих компонентах, которые отвечают за перенаправление.

3. Перенаправление с контроллера входа в систему

Самый простой способ достичь нашей цели-определить конечную точку для страницы входа в контроллер.

Нам также потребуется вернуть определенную страницу, если пользователь аутентифицирован, а страница входа в систему в противном случае:

@GetMapping("/loginUser")
public String getUserLoginPage() {
    if (isAuthenticated()) {
        return "redirect:userMainPage";
    }
    return "loginUser";
}

4. Использование перехватчика

Другой способ перенаправления пользователей – через перехватчик в URI страницы входа.

Перехватчик перехватит запрос до того, как он поступит на контроллер. Таким образом, на основе аутентификации мы можем решить, разрешим ли мы ее продолжить или заблокируем и вернем ответ на перенаправление.

Если пользователь аутентифицирован, нам нужно будет изменить две вещи в ответе:

  • Установите код состояния в Статус Http.SC_TEMPORARY_REDIRECT
  • Добавьте заголовок Местоположение с URL-адресом перенаправления

И, наконец, мы прервем цепочку выполнения, вернув false :

public class LoginPageInterceptor implements HandlerInterceptor {
    UrlPathHelper urlPathHelper = new UrlPathHelper();
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        if ("/loginUser".equals(urlPathHelper.getLookupPathForRequest(request)) && isAuthenticated()) {
            String encodedRedirectURL = response.encodeRedirectURL(
              request.getContextPath() + "/userMainPage");
            response.setStatus(HttpStatus.SC_TEMPORARY_REDIRECT);
            response.setHeader("Location", encodedRedirectURL);

            return false;
        } else {
            return true;
        }
    }

    // isAuthenticated method 
}

Нам также нужно будет добавить перехватчик в жизненный цикл Spring MVC :

@Configuration
public class LoginRedirectMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginPageInterceptor());
    }
}

Мы могли бы использовать конфигурацию Spring на основе XML-схемы для достижения той же цели:


    
        
        
    

5. Использование фильтра

Аналогичным образом мы можем реализовать пружинный фильтр.

Фильтр может быть непосредственно применен к контексту Безопасности с помощью цепочки фильтров Spring Security. Таким образом, он может перехватить запрос сразу после создания аутентификации.

Давайте расширим GenericFilterBean, переопределим метод doFilter и проверим аутентификацию:

public class LoginPageFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
        HttpServletRequest servletRequest = (HttpServletRequest) request;
        HttpServletResponse servletResponse = (HttpServletResponse) response;

        if (isAuthenticated() && "/loginUser".equals(servletRequest.getRequestURI())) {

            String encodedRedirectURL = ((HttpServletResponse) response).encodeRedirectURL(
              servletRequest.getContextPath() + "/userMainPage");

            servletResponse.setStatus(HttpStatus.SC_TEMPORARY_REDIRECT);
            servletResponse.setHeader("Location", encodedRedirectURL);
        }

        chain.doFilter(servletRequest, servletResponse);
    }
    // isAuthenticated method 
}

Нам нужно будет добавить фильтр после Фильтр проверки подлинности имени пользователя в цепочке фильтров.

Кроме того, нам нужно будет авторизовать запрос URI страницы входа в систему, чтобы включить для него цепочку фильтров:

@Configuration
@EnableWebSecurity
public class LoginRedirectSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .addFilterAfter(new LoginPageFilter(), UsernamePasswordAuthenticationFilter.class)
          .authorizeRequests().antMatchers("/loginUser").permitAll()
           
        // Other security configuration
    }
}

Наконец, если мы решим использовать конфигурацию XML, мы можем определить компонент для фильтра и добавить его в цепочку фильтров в теге security HTTP :




    
    

Краткое руководство по созданию пользовательского фильтра для Spring Security можно найти здесь .

6. Заключение

В этом уроке мы рассмотрели несколько способов перенаправления уже зарегистрированных пользователей со страницы входа в систему с помощью Spring Security.

Как всегда, полный исходный код, используемый в этом руководстве, доступен на GitHub .

Еще один учебник , который может представлять интерес, – перенаправление на разные страницы после входа в систему с помощью Spring Security, в котором мы узнаем, как перенаправлять разные типы пользователей на определенные страницы.