2009-11-05 18 views
6

Mi requisito es proporcionar: La autenticación basada en contraseñas¿Puedo poner 3 esquemas de autenticación diferentes en la misma configuración de seguridad de primavera?

  1. ID de usuario. La autenticación basada
  2. Open ID
  3. autenticación basada en URL (es una costumbre sso impl tenemos)

en el mismo proyecto.

me han tratado de tapar en la seguridad de primavera en un proyecto existente como (código simplificada para simplificar):

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation= 
    "http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-2.0.1.xsd"> 

    <http auto-config="false"> 
     <remember-me user-service-ref="rememberMeUserService" key="some custom key" /> <!-- TODO: Key made for testing reasons.... --> 
     <intercept-url pattern='/mainApplication/Main screen.html' access="ROLE_ADMIN"/> 
     <intercept-url pattern='/**' filters="none"/> <!-- Allow entry to login screen --> 
     <openid-login authentication-failure-url="/Login.html?error=true" default-target-url="/mainApplication/Main screen.html" user-service-ref="openIdUserService"/> 
     <form-login login-page="/Login.html" authentication-failure-url="/Login.html?error=true" always-use-default-target="true" default-target-url="/mainApplication/Main screen.html"/> 
    </http> 

    <beans:bean id="rememberMeUserService" class="mypackage.CustomUserService"> 
     <beans:property name="usersService" ref="usersService"></beans:property> 
    </beans:bean> 

    <!-- Common login shared entry-point for both Form and OpenID based logins -->  
    <beans:bean id="entryPoint" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint"> 
     <beans:property name="loginFormUrl" value="/Login.html" /> 
    </beans:bean> 
    <authentication-manager alias="authenticationManager"/> 

    <beans:bean id="MyCustomAuthenticationProvider" class="mypackage.CustomAuthenticationProvider"> 
     <custom-authentication-provider /> 
     <beans:property name="usersService" ref="usersService"></beans:property> 
    </beans:bean> 

    <beans:bean id="openIdAuthenticationProvider" class="org.springframework.security.providers.openid.OpenIDAuthenticationProvider"> 
     <custom-authentication-provider /> 
     <beans:property name="userDetailsService" ref="openIdUserService"/> 
    </beans:bean> 

    <beans:bean id="openIdUserService" class="mypackage.OpenIDUserDetailsService"> 
     <beans:property name="usersService" ref="usersService"/> 
    </beans:bean> 

    <!-- Great, now i want to include SSO based sign on --> 
    <!-- need to intercept a url of the form : /myApp/customLogin/<key> where <key> is my token key --> 

</beans:beans> 

como se mencionó anteriormente, i necesidad de realizar un seguimiento de una dirección URL de la forma:/myApp/customLogin/12345, donde 1235 es la clave razón, al principio estábamos usando (código simplificada para mayor simplicidad)

<servlet-mapping> 
    <servlet-name>mySSOCapture</servlet-name> 
    <url-pattern>/myApp/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/MyServlet</url-pattern> 
</servlet-mapping> 

¿Qué debo hacer para activar la seguridad de primavera para ayudar a manejar este esquema de autenticación de la tercera?

una pregunta corolario es: ¿puedo tener muchos proveedores de autenticación en el mismo proyecto? en caso afirmativo, ¿cómo pueden combinarse con diferentes funcionalidades (por ejemplo, una que proporciona autenticación basada en url, una que proporciona autenticación anónima, etc.)?

+0

sso: de sesión único (usuario está autenticado por el mero hecho de tener un token). El mapeo de servlet escrito arriba está en mi web.xml. La autenticación de identificación abierta y la autenticación de contraseña de nombre de usuario funcionan bien. Mi página de inicio de sesión contiene dos formularios, uno para el inicio de sesión normal y otro para el inicio de sesión basado en id. –

Respuesta

1

Bueno, aquí está la solución:

<beans:bean id="mySsoFilter" class="somePackage.MySsoProcessingFilter"> 
    <custom-filter after="CAS_PROCESSING_FILTER"/> <!-- Just a reference Point--> 
    <beans:property name="authenticationManager" ref="authenticationManager"/> 
    <beans:property name="defaultTargetUrl" value='/mainApplication/Main screen.html' /> 
    <beans:property name="authenticationFailureUrl" value="/Login.html?error=true"/> 
</beans:bean> 

Espero que esto ayude a alguien en necesidad ...

+0

así como usé el "después", también utilicé "antes" para agregar otro SSO !! Tenga en cuenta que CAS no tiene nada que ver con mi sistema. –

1

No se puede responder la pregunta directamente, pero es una "pista útil" del sector de gestión de identidades: no todos los sistemas de autenticación tienen el mismo valor de confianza: es un incumplimiento grave del buen diseño de seguridad tratarlos por igual.

Espero que esto ayude con su diseño ...

+0

Bueno, agrega una dimensión filosófica a mi pregunta: D No veo el sentido de esta respuesta, aunque –

+0

Solo estaba sugiriendo algo que tener en cuenta.Lo siento si no se aplica a usted. – caving

1

Probablemente hay varias maneras de hacer esto. Hay alguna funcionalidad que hace algo muy similar, a saber, Pre-authentication. Es un buen ejemplo de cómo puede agregar un filtro personalizado que autentique al usuario, después de lo cual el resto del marco debería tomar el control.

Lo que hace un AuthenticationProvider es examinar el objeto Authentication que se carga en la sesión por un filtro anterior. Puede registrar tantos proveedores de autenticación como desee con el administrador de autenticación (que simplemente ejecuta el objeto Authentication a través de todos ellos), pero debe administrar para obtener algún filtro que maneje su esquema de autenticación y llene el objeto Authentication. Si desea que este filtro también interactúe con el usuario (es decir, muestre un formulario de inicio de sesión o algo así), podría interferir con otros filtros. En ese caso, puede usar cadenas de filtro separadas, pero esto no parece ser necesario en su caso.

+0

Leí sobre PreAuthentication, creo que está equivocado con mi pregunta, quería permitir a los usuarios iniciar sesión de 3 maneras diferentes: nombre de usuario/contraseña, Open Id, SSO. –

+0

Agradezco la información adicional sobre los administradores de autenticación, esa información ha aclarado algunos de mis aspectos básicos, no estoy seguro de lo que quiere decir con respecto a las cadenas de filtros. –

+0

Lo siento, pensé que su esquema de inicio de sesión era demasiado diferente del resto para poder encajar perfectamente allí. En cuanto a las cadenas de filtro, básicamente hay una cadena de filtros de seguridad de primavera por la que pasan todas las solicitudes, pero si es necesario, puede configurar dos o más, filtrando en diferentes URL. De esta forma puede usar filtros/mecanismos de autenticación completamente diferentes, pero se vuelve un poco complicado. – wds

Cuestiones relacionadas