Подтвердить что ты не робот

Как вручную выйти из системы с помощью spring безопасности?

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

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

?

4b9b3361

Ответ 1

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

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

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

Обычно это означает, что SecurityContextHolder будет очищен out, HttpSession будет признан недействительным, любой "Запомнить меня", аутентификация будет очищена и т.д.

Ответ 2

Мне трудно сказать наверняка, достаточно ли вашего кода. Однако стандартная реализация Spring -security для выхода из системы отличается. Если вы посмотрели SecurityContextLogoutHandler, вы увидите, что они делают:

    SecurityContextHolder.clearContext();

Кроме того, они необязательно аннулируют HttpSession:

    if (invalidateHttpSession) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
    }

Вы можете найти дополнительную информацию в другом вопросе о выходе из системы Spring Безопасность и просмотрев исходный код org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler.

Ответ 3

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

Ответ 4

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

В настройке безопасности URL-адрес страницы выхода:

<sec:http ...>
  ...
  <sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" />
  ...
</sec:http>

Ответ 5

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

sessionRegistry.getSessionInformation(sessionId).expireNow();

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

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

Ответ 6

Недавно нам пришлось реализовать функции выхода из системы, используя 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"/>

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

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

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

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

Ответ 7

Просто сделайте так (те, что прокомментировали "беспокоиться" ):

    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
    }

Ответ 8

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

Ответ 9

Right Oledzki, я использую, например, внутри своего контроллера для выхода из системы и перенаправления пользователя на страницу входа в систему spring security 4.2.3

SecurityContextHolder.clearContext();

if(session != null)
    session.invalidate();

return "redirect:/login";