9 ответов:
в контейнере Servlet 3.0 функция весеннего выхода из системы интегрирована с сервлетом, и вы просто вызываете
logout()наHttpServletRequest. Все еще нужно написать допустимый контент ответа.по данным документация (Весна 3.2):
HttpServletRequest.метод logout () может использоваться для выхода текущего пользователя из системы.
обычно это означает, что SecurityContextHolder будет очищен вон, тот Объекта httpsession будет признан недействительным, каких-либо "Запомнить меня" аутентификация будет очищена и т. д.
мне трудно сказать наверняка, достаточно ли вашего кода. Однако стандартная реализация Spring-security для выхода из системы отличается. Если вы взглянули на
SecurityContextLogoutHandlerвы бы видели, что они делают:SecurityContextHolder.clearContext();кроме того, они необязательно аннулируют HttpSession:
if (invalidateHttpSession) { HttpSession session = request.getSession(false); if (session != null) { session.invalidate(); } }вы можете найти более подробную информацию в каком-то другом вопросе о выходе из системы Spring Security и код
org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler.
Я использую тот же код в LogoutFilter, повторно используя LogoutHandlers следующим образом:
public static void myLogoff(HttpServletRequest request, HttpServletResponse response) { CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY); SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler(); cookieClearingLogoutHandler.logout(request, response, null); securityContextLogoutHandler.logout(request, response, null); }
вы также можете использовать SessionRegistry как:
sessionRegistry.getSessionInformation(sessionId).expireNow();если вы хотите принудительно выйти из системы во всех сеансах пользователя, то используйте
getAllSessionsметод и называютexpireNowинформации о каждом сеансе.Edit
Для этого требуетсяConcurrentSessionFilter(или любой другой фильтр в цепочке), который проверяет SessionInformation и вызывает все обработчики выхода из системы, а затем перенаправляет.
для выхода пользователя из веб-приложения вы также можете перенаправить его на страницу выхода. Затем LogoutFilter выполняет всю работу за вас.
url-адрес страницы выхода задается в конфигурации безопасности:
<sec:http ...> ... <sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" /> ... </sec:http>
недавно нам пришлось реализовать функцию выхода из системы С помощью Spring-security 3.0.5. Хотя на этот вопрос уже дан ответ выше, я опубликую полный код, который определенно поможет начинающему пользователю, как я:)
конфигурация весной-безопасности.xml
<http auto-config="false" lowercase-comparisons="false" use-expressions="true"> <custom-filter position="LOGOUT_FILTER" ref="logoutFilter" /> </http> <beans:bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter"> <beans:constructor-arg name="logoutSuccessHandler" ref="xxxLogoutSuccessHandler" /> <beans:constructor-arg name="handlers"> <beans:list> <beans:ref bean="securityContextLogoutHandler"/> <beans:ref bean="xxxLogoutHandler"/> </beans:list> </beans:constructor-arg> <beans:property name="filterProcessesUrl" value="/logout"/> </beans:bean> <beans:bean id="XXXLogoutSuccessHandler" class="com.tms.dis.sso.XXXLogoutSuccessHandler"/> <beans:bean id="securityContextLogoutHandler" class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"> <beans:property name="invalidateHttpSession" value="true"/> </beans:bean> <beans:bean id="XXXLogoutHandler" class="com.tms.dis.sso.XXXLogoutHandler"/>здесь я создал два пользовательских класса
- XXXLogoutHandler, который будет реализовывать org.springframework.безопасность.сеть.идентификация.выход из системы.LogoutHandler и будет переопределять метод logout ().
- XXXLogoutSuccessHandler, который будет реализовывать org.springframework.безопасность.сеть.идентификация.выход из системы.LogoutSuccessHanlder и переопределит метод onLoguoutSuccess (). В рамках XXXLogoutSuccessHandler.метод onLogoutSuccess () вызывает метод redirectStrategy.метод sendRedirect (), который выводит пользователя на определенный targetURL.
- org.springframework.безопасность.сеть.идентификация.выход из системы.SecurityContextLogoutHandler выполняет задачу аннулирования пользователя сессия.
надеюсь, что это поможет и даст правильное направление для стартера
Примечание: намеренно не опубликовали код для пользовательской реализации.
просто сделайте так (те, которые прокомментированы "касаются вас"):
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); // concern you User currUser = userService.getUserById(auth.getName()); // some of DAO or Service... SecurityContextLogoutHandler ctxLogOut = new SecurityContextLogoutHandler(); // concern you if( currUser == null ){ ctxLogOut.logout(request, response, auth); // concern you }
Right Oledzki, я использую следующее, например, внутри моего контроллера для выхода из системы и перенаправления пользователя на страницу входа в spring security 4.2.3
SecurityContextHolder.clearContext(); if(session != null) session.invalidate(); return "redirect:/login";
Comments