mvc - spring security pdf
¿Cómo desconectar manualmente a un usuario con seguridad de primavera? (9)
Bien, Oledzki, estoy usando lo siguiente, por ejemplo, dentro de mi controlador para desconectarme y redireccionar al usuario a la página de inicio de sesión en spring security 4.2.3
SecurityContextHolder.clearContext();
if(session != null)
session.invalidate();
return "redirect:/login";
Probablemente la respuesta es simple: ¿cómo puedo desconectarme manualmente del usuario actualmente conectado en la seguridad de primavera? ¿Es suficiente llamar?
SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false);
?
En el contenedor Servlet 3.0, la funcionalidad de cierre de sesión de Spring está integrada con el servlet y usted acaba de invocar logout()
en su HttpServletRequest
. Aún necesita escribir un contenido de respuesta válido.
De acuerdo con la documentation (primavera 3.2):
El método HttpServletRequest.logout () se puede usar para desconectar al usuario actual.
Por lo general, esto significa que SecurityContextHolder se borrará, la HttpSession se invalidará, cualquier autenticación "Remember Me" se limpiará, etc.
Es difícil para mí decir con certeza si tu código es suficiente. Sin embargo, la implementación estándar de Spring-security es diferente. Si echas un vistazo a SecurityContextLogoutHandler
, verás que lo hacen:
SecurityContextHolder.clearContext();
Además, opcionalmente invalidan la HttpSession:
if (invalidateHttpSession) {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
}
Puede encontrar más información en alguna otra pregunta sobre el org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler
sesión en Spring Security y mirando el código fuente de org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler
.
Para cerrar la sesión de un usuario en una aplicación web, también puede redirigirlo a la página de cierre de sesión. El LogoutFilter está haciendo todo el trabajo por usted.
La url de la página de cierre de sesión se establece en la configuración de seguridad:
<sec:http ...>
...
<sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" />
...
</sec:http>
Recientemente tuvimos que implementar la funcionalidad de cierre de sesión utilizando Spring-security 3.0.5. Aunque esta pregunta ya está respondida arriba, publicaré el código completo que definitivamente ayudaría al usuario novato como yo :)
Configuración en 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"/>
Aquí he creado dos clases personalizadas
- XXXLogoutHandler que implementará org.springframework.security.web.authentication.logout.LogoutHandler y anulará el método logout ().
- XXXLogoutSuccessHandler que implementará org.springframework.security.web.authentication.logout.LogoutSuccessHanlder y anulará el método de LoguoutSuccess (). Dentro del método XXXLogoutSuccessHandler.onLogoutSuccess () llame al método redirectStrategy.sendRedirect () que cierra la sesión del usuario a la URL del objetivo particular.
- org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler realiza la tarea de invalidar la sesión del usuario.
Espero que esto ayude y dé la dirección correcta al principiante
Nota : Intencionalmente no se ha publicado el código para la implementación personalizada.
Simplemente hazlo así (los comentados por "te preocupamos"):
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
}
También puede usar SessionRegistry como:
sessionRegistry.getSessionInformation(sessionId).expireNow();
Si desea forzar el cierre de sesión en todas las sesiones de un usuario, utilice el método getAllSessions
y llame a expireNow
de cada información de sesión.
Editar
Esto requiere ConcurrentSessionFilter
(o cualquier otro filtro en la cadena), que comprueba SessionInformation y llama a todos los manejadores de cierre de sesión y luego redirige.
Uso el mismo código en LogoutFilter, reutilizando LogoutHandlers de la siguiente manera:
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);
}
new SecurityContextLogoutHandler().logout(request, null, null);