Вероятно, ответ прост: как я могу вручную выйти из текущего зарегистрированного пользователя в spring безопасности? Достаточно ли позвонить:
SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false);
?
Вероятно, ответ прост: как я могу вручную выйти из текущего зарегистрированного пользователя в spring безопасности? Достаточно ли позвонить:
SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false);
?
В контейнере Servlet 3.0 Spring функция выхода из системы интегрирована с сервлетом, и вы просто вызываете logout()
на HttpServletRequest
. Все еще нужно написать достоверное содержимое ответа.
Согласно документации (Spring 3.2):
Метод HttpServletRequest.logout() может использоваться для регистрации текущего пользователя.
Обычно это означает, что SecurityContextHolder будет очищен out, HttpSession будет признан недействительным, любой "Запомнить меня", аутентификация будет очищена и т.д.
Мне трудно сказать наверняка, достаточно ли вашего кода. Однако стандартная реализация 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
.
Я использую тот же код в 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);
}
Чтобы выйти из пользовательского веб-приложения, вы также можете перенаправить его на страницу выхода. Затем LogoutFilter выполняет всю вашу работу.
В настройке безопасности URL-адрес страницы выхода:
<sec:http ...>
...
<sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" />
...
</sec:http>
Вы также можете использовать SessionRegistry как:
sessionRegistry.getSessionInformation(sessionId).expireNow();
Если вы хотите принудительно выйти из системы во всех сеансах пользователя, используйте метод getAllSessions
и вызовите expireNow
каждой информации о сеансе.
Edit
Для этого требуется ConcurrentSessionFilter
(или любой другой фильтр в цепочке), который проверяет SessionInformation и вызывает все обработчики выходных данных, а затем перенаправляет.
Недавно нам пришлось реализовать функции выхода из системы, используя 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"/>
Здесь я создал два пользовательских класса
Надеюсь, это поможет и даст правильное направление стартеру
Примечание. Преднамеренно не размещен код для пользовательской реализации.
Просто сделайте так (те, что прокомментировали "беспокоиться" ):
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";