2011-05-25 30 views
6

Me pregunto si, con Spring Security, puedo validar las sesiones de usuario, permitiendo que solo se abra una pestaña del navegador. ¿Es posible?¿Puedo gestionar varias pestañas del navegador con Spring Security?

También me gustaría saber si puedo hacerlo, cuando el usuario cierra la pestaña y la abre de nuevo antes de que termine su sesión. SesiónFilter desde la aplicación directa, sin ir a la pantalla de inicio de sesión.

estoy usando JSF 1.2, RichFaces 3.3.3, Hibernate y co ...

Detalle: Sé que la seguridad de primavera, sólo estoy investigándolo.

Ahora gracias y disculpe por mi mal inglés.

See you!

Respuesta

4

No. Spring Security no puede decir si la solicitud era de la pestaña original o de una pestaña nueva, esa información es estrictamente del lado del cliente. De http://static.springsource.org/spring-security/site/faq.html:

2.1.

Estoy usando el control de sesión concurrente de Spring Security para evitar que los usuarios de inicien sesión más de una vez a la vez. Cuando abro otra ventana del navegador después de iniciar sesión, no me impide volver a iniciar sesión. ¿Por qué puedo registrar en más de una vez?

Los navegadores generalmente mantienen una sola sesión por instancia de navegador. Usted no puede tener dos sesiones separadas en una vez. Por lo tanto, si vuelve a iniciar sesión en otra ventana o pestaña, solo está autenticando en la misma sesión. El servidor no sabe nada acerca de las pestañas , ventanas o instancias del navegador. Todo lo que ve son solicitudes HTTP y vincula a los de una sesión particular según el valor de la cookie JSESSIONID que contienen. Cuando un usuario se autentica durante una sesión , el control de sesión concurrente de Spring Security comprueba el número de otras sesiones autenticadas que tienen . Si ya están autenticados con la misma sesión, , entonces la reautorización no tendrá efecto .

+0

hmm, entonces, ¿puedo abrir dos pestañas con el mismo JSESSIONID? que apesta. Me gustaría bloquear 2 pestañas. 2 navegadores no son un problema. ¿Alguien sabe de otra manera/framework/algo para hacer eso? aplausos – caarlos0

2

Recientemente he implementado una solución para varias pestañas/ventanas usando Spring Security. Para iniciar sesión con éxito utilizo `LoginSucessHandler`` y establezco un nombre de ventana único en la sesión. En la página de la plantilla principal, configuré un nombre de ventana y en cada página cargué el nombre de la ventana de verificación con el nombre de la ventana de la sesión, si no es el mismo, entonces redirija a la página de error.

A continuación se presentan configuraciones y código:

@Service 
public class LoginSucessHandler extends 
     SavedRequestAwareAuthenticationSuccessHandler { 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication) 
      throws ServletException, IOException { 
     User user = (User) authentication.getPrincipal(); 
     String windowName = user.getUsername() + new Date().getTime(); 
     HttpSession session = request.getSession(); 
     session.setAttribute("windowName", windowName); 
     session.setAttribute("windowNameToSet", windowName); 
     super.onAuthenticationSuccess(request, response, authentication); 
    } 

} 

plantilla o encabezado principal página:

<script> 
    <%if (session.getAttribute("windowNameToSet") != null) { 
     out.write("window.name = '" 
      + session.getAttribute("windowNameToSet") + "';"); 
     session.removeAttribute("windowNameToSet"); 
    }%> 
    if (window.name != "<%=session.getAttribute("windowName")%>") { 
     window.location = "<%=request.getContextPath()%>/forms/multiwindowerror.jsp"; 
    } 
</script> 

Para contexto de seguridad:

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/login.hst**" access="anonymous or authenticated" /> 
    <intercept-url pattern="/**/*.hst" access="authenticated" /> 
    <form-login login-page="/login.hst" 
     authentication-failure-url="/login.hst?error=true" 
     authentication-success-handler-ref="loginSucessHandler" /> 
    <logout invalidate-session="true" logout-success-url="/home.hst" 
     logout-url="/logout.hst" /> 
    <remember-me key="jbcp" authentication-success-handler-ref="loginSucessHandler"/> 
</http> 

Sólo asegúrese de que el anterior login.jsp JavaScript no está incluido.

0

Descubrí una forma más fácil de lograr lo mismo. Si ya está extendiendo SimpleUrlAuthenticationSuccessHandler, similar a @Jagar, cree una lista de usuarios iniciados, agregue al usuario y añádalo a la sesión. Luego, cada vez que inicie sesión, verifique si la sesión existe y si ese usuario está en el atributo de arraylista de sesión. Si es así, entonces fallará, si no lo está, permita el inicio de sesión.

De esta manera puede tener varios usuarios conectados con el mismo navegador, pero no el mismo usuario. Eso también evita la posibilidad de sobrescribir incorrectamente el atributo windowName.

Cuestiones relacionadas