java - sirve - spring security example
Cómo procesar un inicio de sesión de formulario con Spring Security/Spring MVC (6)
Pregunta simple, solo necesito un puntero en la dirección correcta:
Tengo una simple aplicación web Spring MVC / Spring Security. Inicialmente configuré Spring Security para que la página de inicio de sesión predeterminada muestre y se autentique correctamente (implementé UserDetailsService
con DaoAuthenticationProvider
para hacer esto).
Siguiente paso: reemplace la página de inicio de sesión de primavera predeterminada con mi página de inicio de sesión y publique las credenciales.
¿Pero qué hago con las credenciales de inicio de sesión enviadas? Supongo que publico el formulario en un controlador, verifico las credenciales, pero no estoy seguro de cuál es el paso correcto después de eso. P.ej:
- ¿Estoy llamando a un método de AuthenticationManager?
- ¿Debo definir un bean para esto?
- ¿Hay una interfaz / servicio que necesito implementar como un AuthenticationEntryPoint o algo así?
He golpeado los documentos 3 veces y no los sigo. Sé que esto es muy simple, así que solo necesito escuchar cómo debe fluir el proceso.
Agregaré una respuesta aclaratoria para cualquier persona que lea esto en el futuro:
Cuando defina la etiqueta en Spring Safety, manejará el inicio de sesión por usted, voy a repasar cómo funciona en detalle (ojalá fuera esta la detallada en los documentos):
<security:http auto-config="true">
<security:form-login login-page="/login"
login-processing-url="/postlogin"
default-target-url="/myaccount"
authentication-failure-url="/login?loginError=true" />
<security:logout logout-url="/logout" />
</security:http>
La página de inicio de sesión es la url de la página de inicio de sesión. Debe tener un controlador (o página HTML estática) que sirva para esta página, es su forma de inicio de sesión bonita.
La URL de procesamiento de inicio de sesión es una URL que maneja el componente de inicio de sesión de formulario. Es como si el componente de inicio de sesión de formulario implementara su propio controlador para esta página. Debe publicar su formulario en esta página. También necesita saber para nombrar sus parámetros de nombre de usuario / contraseña "j_username" y "j_login"
Más allá de esto, y del resto de las opciones razonablemente obvias anteriores, debería haber implementado un UserDetailsService
, es decir, crear una clase e implementar la interfaz UserDetailsService
que obtiene y devuelve un objeto UserDetails
(nombre de usuario / contraseña) para un nombre de usuario dado. y siempre que con el resto de la configuración de seguridad:
<security:authentication-manager>
<security:authentication-provider ref="daoAuthenticationProvider" />
</security:authentication-manager>
<bean id="daoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider" >
<property name="userDetailsService" ref="myAuthorizationService" />
</bean>
La documentación de referencia de Spring Security describe el flujo de procesamiento básico en 5.4 Autenticación en una aplicación web . Hay un punto # 6:
A continuación, el servidor decidirá si las credenciales presentadas son válidas o no. Si son válidos, el siguiente paso sucederá. Si no son válidos, normalmente se le solicitará al navegador que intente de nuevo (por lo que regresa al paso dos anterior)....
Spring Security tiene distintas clases responsables de la mayoría de los pasos descritos anteriormente. Los participantes principales (en el orden en que se usan) son ExceptionTranslationFilter, AuthenticationEntryPoint y un " mecanismo de autenticación ", que se encarga de llamar al AuthenticationManager que vimos en la sección anterior.
Tengo que admitir que la documentación aquí es un poco confusa, así que le daré algunos consejos más: el " mecanismo de autenticación " mencionado aquí es lo que está buscando, es responsable de procesar las credenciales que el navegador está enviando.
Como los detalles de adjuntar las credenciales a las solicitudes HTTP varían mucho entre los distintos métodos de autenticación (datos de formulario frente a encabezados simples vs. encabezados de resumen), no existe un " mecanismo de autenticación " común; en cambio, cada método implementa su propio mecanismo y en el caso de la autenticación basada en web , generalmente es un filtro especial que debe configurar en web.xml
.
En su caso, lo más probable es que esté interesado en UsernamePasswordAuthenticationFilter : esto se usa para procesar información básica de inicio de sesión basada en formularios . El contrato entre su formulario de inicio de sesión personalizado y el filtro es la URL (donde se publica la forma) + nombres de campo de nombre de usuario y contraseña:
El formulario de inicio de sesión simplemente contiene los campos de entrada j_username y j_password y las publicaciones en la URL que supervisa el filtro (de manera predeterminada, es / j_spring_security_check).
Si está utilizando una base de datos accesible de JDBC, puede usar el siguiente proveedor de autenticación y evitar crear uno personalizado. Reduce el código requerido para 9 líneas de XML:
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password from users where username=?" authorities-by-username-query="select u.username, r.authority from users u, roles r where u.userid = r.userid and u.username =?" />
</authentication-provider>
A continuación, puede configurar su dataSource de la siguiente manera
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/DB_NAME" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
Eche un vistazo a esta publicación: http://codehustler.org/blog/spring-security-tutorial-form-login/ Incluye todo lo que necesita saber sobre la personalización de Spring Security form-login.
Estamos hablando del mismo problema cada vez más, este es mi enfoque , veamos qué dirá la gente.
Vea la publicación de limc en respuesta a la respuesta de Ritesh en Configurando Spring Security 3.x para tener múltiples puntos de entrada. Mire las secciones tituladas:
ACTUALIZACIÓN 29/01/2011 - La técnica de @ Ritesh
ACTUALIZACIÓN - SOLUCIÓN a la técnica de @ Ritesh
Es un buen ejemplo conciso y avanzado de cómo puede personalizar el proceso de inicio de sesión en Spring Security
<security:http auto-config="true">
<security:form-login login-page="/login"
login-processing-url="/postlogin"
default-target-url="/myaccount"
authentication-failure-url="/login?loginError=true" />
<security:logout logout-url="/logout" />
</security:http>
login-page es el formulario de inicio de sesión URL login-processing-url es la URL donde se envía el formulario de inicio de sesión. Spring se autodenominará el administrador de autenticación mapeado por usted en el archivo security.xml.
Proceso
- Debe escribir una clase que implemente org.springframework.security.authentication.AuthenticationProvider con el método modificado Authentication authenticate (Authentication authentication)
- Segunda clase que amplía org.springframework.security.core.userdetails.UserDetailsService con un método reemplazado loadUserByUsername (String username)
- El formulario de segunda clase donde puede llamar a su DAO y validar usuario con base de datos obteniendo nombre de usuario y contraseña.
- En Authentication authenticate (Autenticación de autentificación), comparará la contraseña y devolverá el error.