En el post anterior de Spring Security hemos visto como configurar y arrancar el framework sin que se produzcan problemas. Sin embargo aunque nos hemos autentificado sin ningún problema el formulario que nos aparecía por defecto estaba escrito totalmente en ingles y no era personalizable. Vamos a trabajar en este post la construcción de un spring security login que pueda ser personalizado por el programador . Para ello necesitaremos añadir dos nuevas páginas.
SpringSecurity.xml
Estas dos páginas deberán ser configuradas correctamente para encajar con Spring Security. Para ello deberemos modificar el fichero de springsecurity.xml de la siguiente forma.
</pre> <?xml version="1.0" encoding="UTF-8"?> <bean:beans xmlns:bean="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/security" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd"> <http auto-config="true"> <intercept-url pattern="/aplicacion/**" access="ROLE_Usuario" /> <form-login login-page="/formularioLogin.jsp" username-parameter="usuario" login-processing-url="/login" password-parameter="clave" authentication-failure-url="/error.jsp"/> </http> <authentication-manager> <authentication-provider> <user-service> <user name="manuel" password="1234" authorities="ROLE_Usuario" /> </user-service> </authentication-provider> </authentication-manager> </bean:beans> <pre>
Acabamos de añadir una etiqueta form-login que hace referencia a los siguientes conceptos
login-page: Pagina a la que nos vamos a redirigir para logearnos
authentication-failure-url: Pagina a la que vamos si el usuario y clave son incorrectos
username-parameter:Parámetro del formulario que hace referencia al usuario
password-parameter:Parámetro del formulario que hace referencia a la clave
login-processing-url:Url a la que invoca el formulario para realizar la autentificacion
Vamos a ver la página formularioLogin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="login" method="post"> <p> <label for="usuario">Usuario</label> <input type="text" name="usuario"> </p> <p> <label for="clave">Clave</label> <input type="text" name="clave"> </p> <p><label for="clave"></label> <input type="submit" value="validar"> </p> </form> </body> </html>
Podemos ver como el parámetro de usuario,clave y url de proceso han sido asignados en consonancia con el fichero de SpringSecurity.xml . El siguiente paso es configurar la página de error que en nuestro caso es muy sencilla .
Página error.jsp
</pre> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> No puedes acceder el recurso esta protegido por favor accede via <a href="formularioLogin.jsp">Login</a> </body> </html> <pre>
La siguiente imagen resume las modificaciones que hemos realizado a nivel de springsecurity.xml y como esta afecta al resto de ficheros.
Acabamos de construir un spring security login básico que cuando intentemos acceder a la aplicación nos mostrará la siguiente pantalla de acceso.
El ejemplo ha sido creado con JSP por temas de sencillez pero podría ser perfectamente orientado a Spring MVC.
Colega, de ser necesario podrias explicar un ejemplo de Srping Security utilizando anotacione
aqui te dejo el enlace .
Hola, necesito guardar en una sesión más datos del usuario que se loguea. Por Ejemplo la foto, el nombre o el objeto completo. ¿Cómo podría hacerlo?
Valdría con injectarla https://dzone.com/articles/using-http-session-spring
Buenas tardes te queria preguntar tengo configurado la aplicacion y al intentar realizar login intento ingresar el usuario y la contraseña y obtengo un error 403 ya los parametros estan bien mapeados en el servler-context.xml no se que mas puede ser.
Crees que el hecho que haya configurado los parametros de spring security con un dispatcher en lugar de con un contexListener es el causante que no realice la validacion del logueo de manera correcta?
Recuerda que el contextListener se ejecuta nada más cargar la aplicación ,el despachador es posterior , cuando le invocas. El context se ejecuta sin necesidad de invocar nada.
Hola Cecilio, muy buena explicación. Podrías hacer un ejemplo de interceptor en spring security, ya que no muy bien como funciona.
Saludos
Buen Ejemplo! Cecilito Te apuntas en hacer un ejemplo de integrar angularjs con spring security ? ya no crearias nada en jsp seria interesante como maneja los servicios rest.
Me voy ha apuntar la idea de volver a hablar de Angular
Que tal estoy utilizando un spring security en un sistema pero no se como implementar el login exitoso con 2 dominios diferentes lo tengo solo con uno pero necesito hacer el login dependiendo el dominio seleccionado.
espero me pueda apoyar.
saludos..
y tienen que ir contra el mismo proveedor de seguridad?
Muy bueno el tutorial Cecilio,gracias por ser tan claro y sencillo.Saludos desde Argentina.
gracias 🙂
Buenas tardes cecilio, nose si sea mucha molestia pero podrias hacer un post donde explicaras un ejemplo sencillo de como crear y consumir servicios rest sin la nesecidad de un jsp de login.
algo como esto? https://www.arquitecturajava.com/jax-rs-client-y-servicios-rest/
Estimado Cecilio, gracias por tus aportaciones. Seria de gran ayuda si publicaras un ejemplo completo de como crear una aplicacion con Login que tome aspectos de seguridad como aquello de copiar y pegar la url y denegar acceso ante eso. En Spring MVC por supuesto. Saludos. Gran trabajo.
Me apunto la idea Omar lo que pasa es que a veces no me cabe todo 🙂
Muy bien como siempre: Estoy desarrollando una aplicación por deporte , en la cual le agregue Spring Security, con los usuarios y roles desde base de datos, pero, después del logout, si el usuario presiona el botón regresar, muestra la pagina en la que se encontraba, buscando encontré que proponían agregar un interceptor en el archivo mvc-dispatcher-servlet.xml como le muestro a continuación: El cual -con mi poco conocimiento- creo que por cada petición asigna esos valores, por lo cual, no se si sea la manera correcta de hacerlo (incluso de la pagina que descargue el codigo, advertia que esta era… Read more »
Después del logout, para evitar visualizar la pagina anterior ya sin estar autenticado….
en la configuración de seguridad prueba pones este atributo como false auto-config=”false” además configurar los demás atributos a tus necesidades.
http://stackoverflow.com/questions/5670848/spring-security-logout-back-button
Correcto !!! Si te das cuenta. lo unico que realiza es borrar la cache !!
Saludos
Sería bueno que también se muestre la comparación con la otra forma que tiene Spring Security para manejar la parte de la autenticación y manejo de roles a nivel de BD, ya que tiene una opción para que definas tus tablas maestras en ORACLE y/o otro motor de datos y desde el xml de Spring Security se puede incrustar el Query SQL para obtener la autenticación.
lo tengo pendiente :).
Cecilio Álvarez Caules, buen post; si tienes conocimientos de spring security con LDAP; seria estupendo que lo publiques….GRACIAS…
Tengo intencion de añadir mas cosas de Spring Security me lo apunto 🙂