1. Обзор
В этом коротком уроке мы подробно рассмотрим как отключить перенаправление выхода из системы в Spring Security .
Сначала мы начнем с краткой информации о том, как работает поток выхода из системы в Spring Security. Затем мы проиллюстрируем на практическом примере, как избежать перенаправления пользователей после успешного выхода из системы.
2. Выход из системы весенней безопасности
Короче говоря, Spring Security обеспечивает встроенную поддержку механизма выхода из системы с помощью метода DSL logout ()|/. В принципе, Spring Security запускает выход из системы, когда пользователь нажимает URL-адрес выхода по умолчанию, который является /выход из системы .
Стоит отметить, что по умолчанию URL-адрес выхода из системы был /j_spring_security_logout до Spring Security 4 .
Spring Security предлагает возможность перенаправлять пользователей на определенный URL-адрес после выхода из системы. Однако бывают случаи, когда мы хотим избежать такого поведения.
Итак, без лишних слов, давайте посмотрим, как реализовать логику отключения перенаправления выхода из системы в Spring Security .
3. Отключите Перенаправление Весеннего Выхода Из Системы Безопасности
По умолчанию Spring Security перенаправляет пользователей на /вход в систему?выход из системы после успешного выхода из системы. Итак, в этом разделе мы сосредоточимся на том, как предотвратить перенаправление пользователя на страницу входа в систему после выхода из системы.
Обратите внимание, что мы можем переопределить URL-адрес перенаправления по умолчанию с помощью метода DSL logoutSuccessUrl ()|/.
Главное здесь-показать, как избежать перенаправления, когда /выход из системы URL-адрес вызывается из клиента REST.
На самом деле интерфейс LogoutSuccessHandler предлагает гибкий способ выполнения пользовательской логики при успешном выполнении процесса выхода из системы.
Поэтому здесь мы используем пользовательский LogoutSuccessHandler , чтобы вернуть только чистый код состояния 200 . Таким образом, он не перенаправит нас ни на одну страницу.
Теперь давайте реализуем необходимую конфигурацию безопасности Spring, необходимую для отключения перенаправления выхода из системы:
@Configuration @EnableWebSecurity public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests(authz -> authz .mvcMatchers("/login").permitAll() .anyRequest().authenticated() ) .logout(logout -> logout .permitAll() .logoutSuccessHandler((request, response, authentication) -> { response.setStatus(HttpServletResponse.SC_OK); } ); } }
Важной частью, которую следует отметить из приведенной выше конфигурации, является метод logoutSuccessHandler () . Как мы видим, мы используем лямбда-выражение для определения пользовательского обработчика успеха выхода из системы.
Имейте в виду, что мы также можем создать простой класс реализации интерфейса LogoutSuccessHandler и использовать DSL для передачи его в метод logoutSuccessHandler () .
4. Тестирование
Теперь, когда мы собрали все части вместе, давайте проверим конечную точку /выхода из системы , чтобы убедиться, что все работает так, как ожидалось.
Обратите внимание, что мы будем использовать MockMvc для отправки /выхода из системы запроса в нашем тесте.
Во-первых, давайте создадим простой тестовый класс и введем MockMvc объект в нем:
public class LogoutApplicationUnitTest { @Autowired private MockMvc mockMvc; // test case }
Теперь давайте напишем метод для тестирования нашей /конечной точки выхода из системы :
@Test public void whenLogout_thenDisableRedirect() throws Exception { this.mockMvc.perform(post("/logout").with(csrf())) .andExpect(status().isOk()) .andExpect(jsonPath("$").doesNotExist()) .andExpect(unauthenticated()) .andReturn(); }
Наконец, давайте попробуем разбить наш тестовый код:
- выполнить(post(“/выход из системы”)) вызывает конечную точку /выхода из системы в виде простого запроса POST
- с помощью(csrf()) добавляет ожидаемый параметр _csrf в запрос
- status() возвращает код состояния HTTP-ответа
- JSONPath() позволяет получить доступ и проверить тело HTTP-ответа
5. Заключение
Подводя итог, мы объяснили и проиллюстрировали, как решить проблему отключения перенаправления выхода из системы в Spring Security и Spring Boot.
Как обычно, полный исходный код этой статьи доступен на GitHub .