spring-security - j_spring_security_check - spring security tutorial
Crear una autenticación personalizada con Acegi/Spring Security (3)
Recientemente he presentado una aplicación de muestra que realiza una autenticación personalizada con Spring Security 3. El código fuente está aquí . Más detalles están en esta publicación de blog .
Tengo problemas para descubrir exactamente lo que necesito implementar para usar 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.
Necesito implementar un mecanismo al lado de esto que implemente 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 la documentación de referencia y entiendo bien los conceptos, pero no estoy muy seguro de si necesito un filtro, proveedor o administrador, o dónde / cómo exactamente crear objetos de autenticación . Me he equivocado tratando de extender AbstractProcessingFilter y / o implementar AuthenticationProvider , pero me quedé atrapado entendiendo cómo hago que todos jueguen bien.
Implemente un
AuthenticationProvider
personalizado que obtenga toda su información de autenticación de laAuthentication
:getCredentials()
,getDetails()
ygetPrincipal()
.Conéctelo a 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>
Este paso es opcional, si puede encontrar uno adecuado de implementaciones estándar. De lo contrario, implemente una clase que amplíe la interfaz de
Authentication
en la que puede colocar sus parámetros de autenticación:(e.g. a user identifier, timestamp, signature, etc.)
Extienda un
SpringSecurityFilter
personalizado queSpringSecurityFilter
las dos clases anteriores juntas. Por ejemplo, el filtro puede obtenerAuthenticationManager
y callauthenticate()
usando su implementación deAuthentication
como entrada.Puede extender AbstractAuthenticationProcessingFilter como inicio.
Puede hacer referencia a UsernamePasswordAuthenticationFilter que extiende
AbstractAuthenticationProcessingFilter
.UsernamePasswordAuthenticationFilter
implementa la autenticación estándar de nombre de usuario / contraseña.Configure su Spring Security para agregar o reemplazar el estándar
AUTHENTICATION_PROCESSING_FILTER
. Para pedidos de Spring Security Filter, vea http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#filter-stackAquí hay un fragmento de configuración sobre cómo reemplazarlo con su implementación:
<beans:bean id="myFilter" class="com.example.MyAuthenticationFilter">
<custom-filter position="AUTHENTICATION_PROCESSING_FILTER"/>
</beans:bean>
Este es un ejemplo del archivo de configuración securityContext.xml que utiliza autenticación autenticaFiltro (extensión 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>