2012-02-03 13 views
6

tengo de aplicaciones web y dos dominios para que - example.com y example.ru¿Cómo puedo hacer un inicio de sesión único con seguridad de primavera en dos dominios?

example.com - para internacional

example.ru - para el país local de

Mi aplicación web mediante la seguridad de la primavera para usuarios de autorización, pero si el usuario inicia sesión a través de example.com en example.ru, no está conectado.

¿Cómo puede hacer eso si el usuario inicia sesión a través de example.com o example.ru que iniciará sesión en ambos dominios?

PD: Por cierto mi tela utilización solicitud de autorización a través de OpenID y OAuth

+0

El mecanismo que está buscando se llama inicio de sesión único. –

+0

Uno de los problemas que debe resolver (yo creo que debe implementarlo por su cuenta) es que la identificación de la sesión es más tiempo almacenada en una cookie. Pero el navegador asigna cookies a un dominio, por lo que necesitará manejar dos ID de sesión diferentes – Ralph

+0

La forma correcta de hacerlo es con SSO como dijo Kurt. Sin embargo, dado que está usando OpenID y OAuth, también puede falsificar el inicio de sesión único usando un HTTPClient para abrir el otro sitio web y luego volver a pasar la cookie al usuario. Tuve que hacer esto en entornos en los que mezclamos versiones anteriores de Acegi y nuevas de Spring Security. No es bonito, ni es lo correcto, pero es rápido y hace el trabajo. – Joe

Respuesta

2

Como se ha mencionado que necesita un inicio de sesión único en la solución, Cloudseal proporciona una extensión de seguridad de resorte, que incluye un espacio de nombres de primavera por lo que sólo tiene que hacer algo como:

<security:http entry-point-ref="cloudseal"> 
    <security:intercept-url pattern="/protected/user.do" access="IS_AUTHENTICATED_FULLY" /> 
    <security:intercept-url pattern="/protected/admin.do" access="ROLE_ADMIN" /> 
</security:http> 

<cloudseal:sso endpoint="http://cloudseal.com" entry-point-id="cloudseal" app-id="quickstart"> 
    <cloudseal:keystore location="WEB-INF/keystore.jks" password="nalle123"> 
     <cloudseal:key name="apollo" password="nalle123" /> 
    </cloudseal:keystore> 
    <cloudseal:metadata location="WEB-INF/idp.xml" /> 
</cloudseal:sso> 

Ver www.cloudseal.com/platform/spring-security-single-sign-on

0

Es imposible sin modificar el código de seguridad de la primavera. Lo hice a veces, pero es muy difícil de mantener

Cas es la forma más sencilla de esto en el mundo de Java. http://www.jasig.org/cas

1

Mientras este tipo de funcionalidad no es de ninguna manera trivial, de hecho es posible sin modificar Spring.

El código real es demasiado grande para publicar, por lo que intentaré delinear el principio básico y dejarle la codificación.

  1. Extender la primavera de SavedRequestAwareAuthenticationSuccessHandler e implementar la funcionalidad para serializar y escribir el objeto Authentication a una cookie de sesión con un alcance global. Consulte documentación para el atributo authentication-success-handler-ref en la etiqueta <sec:http> de Spring para obtener más información sobre cómo cablear esto. (Nota: si el problema se produjo en varias aplicaciones web en del mismo dominio, puede, por supuesto, limitar el ámbito de las cookies al dominio actual ).
  2. En todas sus aplicaciones web, añadir a web.xml un <filter> definición llamado springSecurityFilterChain y la clase org.springframework.web.filter.DelegatingFilterProxy y una <filter-mapping> para el filtro con un patrón de URL de /* Usted no tiene que crear el grano real, Spring Security proporciona una implementación predeterminada para ti.
  3. En todas sus aplicaciones web, añadir a web.xml un <filter> definición llamado singleSignonAuthenticationFilterChain con la clase org.springframework.web.filter.DelegatingFilterProxy y una correspondiente <filter-mapping> para el filtro con un patrón de URL de /*
  4. Si ahora se añade un nuevo bean llama singleSignonAuthenticationFilterChain, que debería apuntar a una clase que implements Filter.En el método doFilter(), compruebe si hay un atributo de sesión llamado SPRING_SECURITY_CONTEXT. Si hay , entonces ya estamos conectados. De lo contrario, tome el token serializado Authentication, deserialícelo y use SecurityContextHolder.getContext().setAuthentication(authentication) para autenticar al usuario con Spring. Recuerde también session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext()) o la autenticación tomará lugar cada vez, lo cual es innecesario.

un giro a (4) es que si se entera de que no hay ningún atributo llamado SPRING_SECURITY_CONTEXT, entonces podría ser debido a que el usuario sólo ha cerrado la sesión de la aplicación web actual. En este caso, debe cerrar la sesión de forma global, por lo que en este caso desea eliminar la cookie que contiene el token de autenticación serializado.

Es algo complejo escribir en un resumen de una página, pero espero que entienda la idea general. Actualmente tenemos esto implementado en una aplicación compleja que consiste en múltiples aplicaciones web, y funciona muy bien.

+0

¿Puede elaborar, especialmente los pasos 1 y 4? Intenté esto pero no puedo hacer la guerra 2 para ver la cookie de la guerra 1 – blong824

Cuestiones relacionadas