Подводя итог.
Мне удалось протестировать несколько способов, и вот что я получил:
- Как предложил М. Дейнм в комментариях, возможно не использовать контроллер и, тем не менее, выйти из системы с запросом GET. Вот оно.
.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
- Как предложил Эндрю Саша в разделе ответов, вы можете отключить csrf, поскольку он намеренно запрещает использование GET-запроса. И теперь вы можете использовать GET-запрос для выхода из системы даже без использования какого-либо контроллера.
http.csrf().disable()
- Если вы все еще хотите использовать контроллер, нет из следующих вещей поможет вам
.deleteCookies("remember-me", "JSESSIONID")
.invalidateHttpSession(true)
.clearAuthentication(true)
.logoutSuccessUrl("/")
(я не уверен, но мне кажется, что он не работает, потому что вы выполняете запрос GET и используете свой контроллер для контроля выхода из системы)
- Итак, вы можете сделать это программно
Во-первых, вы добавили имя для помнить меня cookie в конфигурации безопасности Spring:
rememberMe().rememberMeCookieName("remember-me")
А затем в контроллер выхода из системы добавьте следующее:
String cookieName = "remember-me";
Cookie cookie = new Cookie(cookieName, null);
cookie.setMaxAge(0);
cookie.setPath(StringUtils.hasLength(request.getContextPath()) ? request.getContextPath() : "/");
response.addCookie(cookie);
Единственная проблема в том, что вам нужно вручную удалить запись из таблицы persistent_logins
(Чтобы получить запрос и ответ, просто передайте их в метод public void logout(HttpServletRequest request, HttpServletResponse response)
- Можно использовать запрос POST, но использовать его как ссылку с помощью JavaScript или даже простого HTML и CSS.
Решения для этого вы можете найти в этой теме .
Так что у нас здесь?
Подводя итог всему вышесказанному, я могу сказать, что если вам нужен контроллер, вы должны программно написать все самостоятельно (кто-то скажет, что это изобретение колеса).
Тем не менее, можно использовать запрос GET, но без контроллера, который описан в 1-й и 2-й позициях списка.
(Последствия использования запроса GET описаны в Документация CSRF , и он не рекомендует использовать запрос GET из-за его неуязвимости.)
Итак, последнее, что я решил сделать своим любимым, это сделать POST-запрос похожим на GET-запрос (используйте его как ссылку) с помощью JS или HTML и CSS. И поскольку вы используете POST-запрос, вы как бы получаете защиту CSRF.
Надеюсь, это кому-нибудь поможет.