2009-01-15 18 views
21

Tengo problemas para descubrir exactamente lo que necesito implementar para utilizar un método de autenticación personalizado con mi aplicación web utilizando Spring Security. Tengo una aplicación Grails con el complemento Spring Security que actualmente usa la autenticación estándar de usuario/contraseña con un formulario de navegador. Esto está funcionando correctamente.Crear una autenticación personalizada con Acegi/Spring Security

Necesito implementar un mecanismo al lado de esto que implementa un tipo de autenticación MAC. Si la solicitud HTTP contiene varios parámetros (por ejemplo, un identificador de usuario, marca de tiempo, firma, etc.) necesito tomar esos parámetros, realizar algunas comparaciones de hash y firmas/marcas de tiempo, y luego autenticar al usuario.

No estoy 100% seguro de por dónde empezar con esto. ¿Qué clases de Spring Security necesito extender/implementar? He leído Reference Documentation y entiendo bien los conceptos, pero no estoy muy seguro de si necesito un Filtro o Proveedor o Administrador, o dónde/cómo exactamente crear objetos Authentication. Me he equivocado tratando de extender AbstractProcessingFilter y/o implementar AuthenticationProvider, pero me quedé atrapado entendiendo cómo hago que todos jueguen bien.

Respuesta

23
  1. Implementar una costumbre AuthenticationProvider el que recibe toda la información de autenticación del Authentication: getCredentials(), getDetails() y getPrincipal().

    corbata en su mecanismo de autenticación Spring Security utilizando el siguiente fragmento de configuración:

<bean id="myAuthenticationProvider" class="com.example.MyAuthenticationProvider"> 
    <security:custom-authentication-provider /> 
</bean> 
  1. Este paso es opcional, si se puede encontrar uno adecuado desde implementaciones estándar. Si no es así, implementar una clase que se extiende la interfaz Authentication en la que usted puede poner sus parámetros de autenticación:

    (e.g. a user identifier, timestamp, signature, etc.) 
    
  2. extender una costumbre SpringSecurityFilter que une las dos clases anteriores juntos. Por ejemplo, el filtro puede obtener el AuthenticationManager y llamar al authenticate() usando su implementación de Authentication como entrada.

    Puede ampliar AbstractAuthenticationProcessingFilter para comenzar.

    Puede hacer referencia UsernamePasswordAuthenticationFilter que se extiende AbstractAuthenticationProcessingFilter. UsernamePasswordAuthenticationFilter implementa la autenticación estándar de nombre de usuario/contraseña.

  3. Configure su Spring Security para agregar o reemplazar el estándar AUTHENTICATION_PROCESSING_FILTER. Para la primavera de Seguridad órdenes de filtro, consulte http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#filter-stack

    Aquí hay un fragmento de configuración de la forma de sustituir con su aplicación:

<beans:bean id="myFilter" class="com.example.MyAuthenticationFilter"> 
    <custom-filter position="AUTHENTICATION_PROCESSING_FILTER"/> 
</beans:bean> 
+0

Creo que necesita usar la posición PRE_AUTH_FILTER en lugar de AUTHENTICATION_PROCESSING_FILTER. Además, es posible que desee consultar este tutorial para una implementación de autenticación en Google AppEngine: http://blog.springsource.com/2010/08/02/spring-security-in-google-app-engine/ – Tal

1

Aquí es un ejemplo de fichero de configuración securityContext.xml usando autenticationFilter personalizado (extendiendo AUTHENTICATION_PROCESSING_FILTER) y authenticationProvider. Los datos de autenticación de usuario son provistos por la conexión jdbc. La configuración es para Spring Security 2.0.x

<?xml version="1.0" encoding="UTF-8"?> 

<sec:global-method-security /> 

<sec:http auto-config="false" realm="CUSTOM" create-session="always" servlet-api-provision="true" 
    entry-point-ref="authenticationProcessingFilterEntryPoint" access-denied-page="/notauthorized.xhtml" 
    session-fixation-protection="migrateSession"> 
    <sec:port-mappings> 
    <sec:port-mapping http="80" https="443" /> 
    </sec:port-mappings> 

    <sec:anonymous granted-authority="ROLE_ANONYMOUS" username="Anonymous" /> 
    <sec:intercept-url pattern="/**" access="ROLE_ANONYMOUS, ROLE_USER" /> 

    <sec:logout logout-url="/logoff" logout-success-url="/home.xhtml" invalidate-session="false" /> 

</sec:http> 

<bean id="authenticationProcessingFilterEntryPoint" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint"> 
    <property name="loginFormUrl" value="/login.xhtml" /> 
    <property name="forceHttps" value="false" /> 
</bean> 

<bean id="authenticationProcessingFilter" class="mypackage.CustomAuthenticationProcessingFilter"> 
    <sec:custom-filter position="AUTHENTICATION_PROCESSING_FILTER" /> 
    <property name="defaultTargetUrl" value="/" /> 
    <property name="filterProcessesUrl" value="/logon" /> 
    <property name="authenticationFailureUrl" value="/loginError.xhtml" /> 
    <property name="alwaysUseDefaultTargetUrl" value="false" /> 
    <property name="authenticationManager" ref="authenticationManager" /> 
</bean> 

<jee:jndi-lookup id="securityDataSource" jndi-name="jdbc/DB_DS" /> 

<bean id="myUserDetailsService" class="mypackage.CustomJdbcDaoImpl"> 
    <property name="dataSource" ref="securityDataSource" /> 
    <property name="rolePrefix" value="ROLE_" /> 
</bean> 

<bean id="apcAuthenticationProvider" class="mypackage.CustomDaoAuthenticationProvider"> 
    <property name="userDetailsService" ref="myUserDetailsService" /> 
    <sec:custom-authentication-provider /> 
</bean> 

<bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager"> 
    <property name="providers"> 
    <list> 
    <ref local="apcAuthenticationProvider" /> 
    </list> 
    </property> 
</bean> 

</beans> 
1

Recientemente he puesto una aplicación de ejemplo que hace de autenticación personalizado con la primavera de Seguridad 3. El código fuente es here. Más detalles están en this blog post.

Cuestiones relacionadas