Как вручную выйти из системы с помощью Spring Security? - PullRequest
65 голосов
/ 20 апреля 2011

Вероятно, ответ прост: как я могу вручную выйти из текущего вошедшего в систему пользователя в Spring Security? Достаточно ли позвонить:

SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false); 

Ответы [ 9 ]

64 голосов
/ 20 апреля 2011

Мне трудно сказать наверняка, достаточно ли вашего кода.Однако реализация стандартного 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.

33 голосов
/ 29 января 2014

В контейнере Servlet 3.0 функция выхода из Spring интегрирована с сервлетом, и вы просто вызываете logout() на вашем HttpServletRequest.Еще нужно написать действительное содержание ответа.

Согласно документации (Spring 3.2):

HttpServletRequest.logout() метод может использоваться для выхода из системы текущего пользователя.

Обычно это означает, что SecurityContextHolder будет очищен, HttpSession будет недействительным, любая аутентификация «Помни меня» будет очищена,и т. д.

19 голосов
/ 12 декабря 2012

Я использую тот же код в 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);
}
10 голосов
/ 31 августа 2012

Чтобы выйти из пользователя в веб-приложении, вы также можете перенаправить его на страницу выхода из системы. Затем LogoutFilter сделает всю работу за вас.

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

<sec:http ...>
  ...
  <sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" />
  ...
</sec:http>
10 голосов
/ 20 апреля 2011

Вы также можете использовать SessionRegistry как:

sessionRegistry.getSessionInformation(sessionId).expireNow();

Если вы хотите принудительно выйти из системы во всех сеансах пользователя, тогда используйте метод getAllSessions и вызывайте expireNow каждогоинформация о сеансе

Редактировать
Для этого требуется ConcurrentSessionFilter (или любой другой фильтр в цепочке), который проверяет SessionInformation и вызывает все обработчики выхода из системы, а затем выполняет перенаправление.

2 голосов
/ 08 февраля 2017

new SecurityContextLogoutHandler().logout(request, null, null);

2 голосов
/ 24 октября 2013

Недавно нам пришлось реализовать функцию выхода из системы с помощью Spring-security 3.0.5. Хотя на этот вопрос уже дан ответ выше, я выложу полный код, который определенно поможет начинающему пользователю, как я:)

Конфигурация в Spring-security.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"/>

Здесь я создал два пользовательских класса

  1. XXXLogoutHandler, который будет реализовывать org.springframework.security.web.authentication.logout.LogoutHandler и переопределит метод logout ().
  2. XXXLogoutSuccessHandler, который будет реализовывать org.springframework.security.web.authentication.logout.LogoutSuccessHanlder и переопределит метод onLoguoutSuccess (). В методе XXXLogoutSuccessHandler.onLogoutSuccess () вызовите метод redirectStrategy.sendRedirect (), который завершает работу пользователя с определенным targetURL.
  3. org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler выполняет задачу аннулирования сеанса пользователя.

Надеюсь, это поможет и даст правильное направление стартеру

Примечание : Намеренно не размещен код для пользовательской реализации.

2 голосов
/ 18 апреля 2013

Просто сделайте вот так (те, что были прокомментированы как «беспокоит вас»):

    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
    }
0 голосов
/ 26 сентября 2017

Право Oledzki, я использую следующее, например, в своем контроллере для выхода из системы и перенаправления пользователя на страницу входа в Spring Security

...