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



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



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


?

864   9  

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"/>

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

  1. XXXLogoutHandler, который будет реализовывать org.springframework.безопасность.сеть.идентификация.выход из системы.LogoutHandler и будет переопределять метод logout ().
  2. XXXLogoutSuccessHandler, который будет реализовывать org.springframework.безопасность.сеть.идентификация.выход из системы.LogoutSuccessHanlder и переопределит метод onLoguoutSuccess (). В рамках XXXLogoutSuccessHandler.метод onLogoutSuccess () вызывает метод redirectStrategy.метод sendRedirect (), который выводит пользователя на определенный targetURL.
  3. 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
    }

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

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

SecurityContextHolder.clearContext();

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

return "redirect:/login";

Comments

    Ничего не найдено.