Quizas una de las partes mas utilizadas y que mas dudas genera en Spring Framework es el framework Spring Security ya que a veces parece que es inmenso y muchas personas no son expertas en seguridad. Vamos a dedicar algunos post a hablar un poco de el y de los conceptos principales que aborda.
Para ello en un primer momento deberemos instalar el framework. Vamos a crear un proyecto Maven con Eclipse que nos permita añadir las siguientes dependencias que son las necesarias para que Spring Security funcione.(si tienes dudas sobre como usar maven puedes revisar los siguientes articulos del blog)
<dependencies> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>3.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>3.2.2.RELEASE</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> </dependencies>
Una vez que tenemos configuradas las dependencias . Vamos a desarrollar la aplicación web mas básica existente que solo incluye una pagina JSP.
Spring Security (Configuración)
Ya tenemos la aplicación construida y deberemos configurarla para que quede protegida por Spring Security . Para ello el primer paso que debemos realizar es dar de alta en el fichero web.xml la ruta en donde tenemos ubicado el fichero de configuración de Spring (usando un context param) . El siguiente paso es declarar un listener que nos inicialice el framework y por último un filtro que protega toda la aplicación de accesos no permitidos y delegue en Spring Framework todas las operativas de seguridad. Así pues el web.xml tendra el siguiente contenido.
Una vez tenemos configurado el fichero web.xml ,el filtro de SpringSecurity se encargará de bloquear el acceso a toda la aplicación.
Vamos a ver el código fuente del web.xml para clarificar dudas:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>web01</display-name> <!-- ruta fichero --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/springSecurity.xml </param-value> </context-param> <!-- listener carga Spring--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- filtro de Spring security--> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
SpringSecurity.xml
Acabamos de configurar el framework Spring ,es momento de ver el contenido del fichero springsecurity.xml . Este fichero es al cual el filtro de Spring delega para gestionar la seguridad.
En este caso hemos elegido un fichero muy sencillo para no complicar las cosas :
<?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="/**" access="ROLE_Usuario" /> </http> <authentication-manager> <authentication-provider> <user-service> <user name="manuel" password="1234" authorities="ROLE_Usuario" /> </user-service> </authentication-provider> </authentication-manager> </bean:beans>
El fichero define varios conceptos fundamentales
A) El grupo de recursos protegidos (URLs)
<http auto-config="true"> <intercept-url pattern="/**" access="ROLE_Usuario" /> </http>
En este caso esta toda la aplicación protegida /** y solo se permite el acceso al role “ROLE_Usuario”.
B) AutenticationManager o gestor de autentificación que decide cuando un usuario es válido. Este gestor esta intimamente relacionado con el concepto de AutenticationProvider o proveedor de autentificación .
<authentication-manager> <authentication-provider> <user-service> <user name="manuel" password="1234" authorities="ROLE_Usuario" /> </user-service> </authentication-provider>
C) Este último el AutenticationProvider define la forma en la que un usuario se ha de validar . Puede ser contra una base de datos , puede ser contra un Ldap, puede ser contra un fichero o puede personalizarse.En nuestro caso estamos utilizando un servicio en memoria que solo permite el acceso al siguiente usuario.
<user name="manuel" password="1234" authorities="ROLE_Usuario" />
El siguiente diagrama clarifica la relación entre los elementos.
Realizada esta operación ejecutamos “maven package” y nos empaquetará la aplicación de tal forma que si la desplegamos en un servidor (Tomcat por ejemplo) e intentamos acceder a la página de bienvenidos ,Spring Security nos bloqueará el acceso y mostrará la siguiente pantalla.
Introducimos de usuario manuel y de clave 1234 y el framework nos dará acceso a la página protegida.
Acabamos de construir el ejemplo de hola mundo con Spring Security.
Muy buen adticulo. Pero utilizando una analogia, lo ideal no seria repartir pescado (ejemplos ya terminados) sino enseñar a pescar. Para lo cual supongo estan los cursos aunque sea una pena que la mayoria sean introductorios. Cuando la realidad es que configurar spring para un entorno especifico no es trivial ya que su flexibikidad implica complejidad. Te animo a que abordes tb cursos avanzados que seguro explicas tan bien como los introductorios
Gran aporte, donde se define. ROLE.Usuario ?? Lo que puede ver??
Gracias! que buena explicación. Ando intentando agregar otro botón, para opciones del tipo Recuperar contraseña, sin embargo si pongo ese botón dentro o fuera del form, no toma la redireccion que deseo, en el botón ejecuto un action que llama un método en un managedbean(jsf), pero lo ignora e intenta autenticar, tienes idea de como podría resolver esto? Muchas gracias!
pues no , hace mucho que escribi el articulo 🙂
Hola Cecilio,
Me gustaria preguntar si es posible tener los filters de las API´s de Spring security y Apache Shiro, pues requiero implementar un aceso sesion unica de usuarios, pero el proyecto que me han entregado tiene una implementación con Shiro para algunas cosas de seguridad y autenticación de usuarios, te agradezco si sabes, si es posible o no pues es la primera vez que hago implementaciones que solucionane vulnerabilidades de sistema.
te agradezco de antemano por tus comentarios y consejos al respecto.
Gracias
En principio Spring Security admite introducir filtros adicionales sin problemas a traves del uso de anotaciones y metodos addBeforeFilter para personalizar a nivel de httpSecurity
Ya no se utiliza maven, ahora se utiliza gradle y se evita los xml’s aún así gracias por el aporte
de nada 🙂
Con Wildfly 10, jsf y Spring Boot
gracias por el aporte
Lo he implementado con éxito……
me alegro 🙂
Hola amigo. Muchas gracias por la explicación. Me pregunto si podría ayudarme con un error que estoy obteniendo:
Could not verify the provided CSRF token because your session was not found.
Me sale al momento de dar submit en el formulario de Login.
No sabría decirte así a bote pronto hay varias respuestas en stack overflow pero ninguna parece la correcta .
[…] Otros artículos relacionados : JAAS , Spring Security […]
Muy buen articulo! por casualidad tendra el proyecto hola mundo en algun repositorio? gracias!
pues no , es algo que estoy pensando hacer más a futuro , pero no tengo tiempo para todo 🙁
Hola Cecilio, tengo otra consulta, como recupero los parámetros de la sesión, por ejemplo quiero mostrar un Bienvenido {usuario}. Gracias.
Usando la variable “principal” sino recuerdo mal
Hola, quisiera saber como hacer para hacer la validación con usuarios de la base de datos y poder configurar las páginas de una forma más bonita, por ejemplo el color de la página del login.
la documentación lo explica fácil http://docs.spring.io/spring-security/site/docs/3.2.x/guides/form.html 🙂
[…] | Read Sources […]
Hola Celio, interesante documentación, Muchas gracias!!!,
Tengo un problema al loguearme con las credenciales correctas me muestra la pantalla lo siguiente:
redirect to : http://localhost:8085/favicon.ico
HTTP Status 403 – Access is denied
Con el error no dice mucho , simplemente que no tienes acceso . Revisa que los usuarios configurados y claves son los correctos 🙁
Hola Celio ante todo gracias por el tuto, tengo un problema al ingresar las credenciales me da lo siguiente:
HTTP Status 403 – Access is denied.
Gracias por tu apoyo.
Muchas gracias, 100% clarificador!
gracias:)
Hola Cecilio, gracias por el aporte, pero tengo un problema, al implementarlo y hacer el deploy, y después de ingresar las credenciales de manuel-1234 me esta mandando el siguiente error: Estado HTTP 500 – javax.servlet.ServletException: javax.servlet.jsp.JspTagException: No message found under code ‘label.ListaProyectos’ for locale ‘es’.
Supongo que cambió la configuración de donde esta tomando los archivos de propiedades, por favor tu apoyo para solucionarlo
saludos
da la sensación de que tienes un error con la TagLibrary confirma que las tienes todas bien instaladas.
Hola Cecilio tengo una duda.
La siguiente regla te permite acceder a toda la aplicacion con el rol de acceso ROLE_Usuario
Esta regla tambien es como la que mensione primero acceso a toda aplicacion web cuyo nombre del war se llama aplicacion?
Saludos.
Muy bueno el pequeño tutorial, lo voy a implentar en mi app web.Gracias.
gracias 🙂
Hola.
estoy usando spring security + jboss as 7, he configurado todo, y no tengo ningun error, al desplegar la app, pero el filtro al parecer no esta funcionando, porque entro a las url protegidas y no me pide logearme.
Web.xml
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
/WEB-INF/spring-security.xml
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
Algo te tiene que faltar . No debiera dejarte revisa que tienes bien puesta en el web.xml la ruta que protege recursos
Buenos dias
Estoy tratando de implementarlo y no me esta redireccionando correctamente!
uhhm has puesto bien el filtro del servlet?
Muy bueno. Muy bien explicado y muy util para los que estamos empezando con esto.
Gracias!
gracias 🙂
Muy buena explicación, ademas de que me sirve mucho para dar mis primeros pasos en Security 🙂 Muchas Gracias por el articulo.
gracias 🙂