En los artículos anteriores, hemos visto como crear un proyecto web con spring, activar jackson, como establecer diferentes entornos y los contenidos estáticos. Ahora lo que vamos hacer es configurar la librería de seguridad, para controlar el acceso a nuestra aplicación.
Con la versión actual, al menos por lo que pone la documentación hay que utilizar las dependencias de spring 4.1.6 o podemos tener problemas con el classpath.
En la siguiente URL podeis accedr al ejemplo del articulo: https://github.com/blancoparis-tfc/SpringSeguridad
Añadir la dependencia de spring security.
En este caso vamos a ir a la pagina del proyecto de spring security, para ver a día de hoy cual es la ultima versión, estable, que en nuestro caso sera la versión 4.0.2.REALEASE, podemos observar que es independiente de la versión del core de spring. Esto es debido a que son proyecto independientes en su desarrollo.Editaremos el fichero de build.gradle y le pondremos la dependencia que nos han pasado.
compile 'org.springframework.security:spring-security-web:4.0.2.RELEASE'
compile 'org.springframework.security:spring-security-config:4.0.2.RELEASE'
Una vez puesta la dependencia podemos observar que el proyecto sigue funcionando, como antes. Ya que por defecto no activa ninguna configuración se seguridad.
Configuración de seguridad.
En este ejemplo vamos a realizar una configuración estándar, que va a consistir en:
Toda la web va a ser privada.
Los usuarios los vamos a poner en memoria, para realizar las pruebas. (Lo normal es que en producción estén en una B.D o LDAP, y en desarrollo en memoria).
Nos logaremos por una pagina web estándar.
Configuración de seguridad.
Para simplificarnos el trabajos y dar claridad a las configuraciones, vamos a crear la configuración de seguridad en una clase separada. Para este ejemplo la configuración va a ser bastante simple, ya que solamente vamos a tener que activar la configuración (@EnableWebSecurity) que herede de la clase WebSecurityConfigurerAdapter y por ultimo le vamos a indicar cual es el usuario en memoria para realizar la configuración.
package org.dbp.conf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class SeguridadConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("user").password("password").roles("USER"); } }
Ya tenemos establecida nuestra configuración de seguridad, pero o sorpresa si arrancamos el proyecto, sigue sin funcionar la seguridad. Esto es debido a que nos falta por poner un filtro, que para que funcione necesitamos que el contexto este compartido, para lo cual tenemos que establecerlo en un filtro para que lo compartan todos. (Nos lo va a indicar cuando activemos el filtro).
Ojo: En los ejemplos básico de internet, esta destalle no lo vamos a ver ya que va a estar todo en la misma configuración.
Configurar el contexto compartido
Para poder tener el contexto compartido tenemos que realizar los siguientes cambios, en el web.xml.
- Configurar el listener: ContextLoaderListener
- Trasladar el fichero de configuración al listener y quitarlo del servlet. (Poniendo una cadena vacía en contextConfigLocation.
<context-param> <param-name>contextClass</param-name> <param-value> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value>org.dbp.conf.WebConfig</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
Ahora vemos en el servlet, como quitar le fichero de configuración.
<init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param>Ya tenemos configurado el contexto, a nivel del contenedor, para que el filtro de seguridad pueda acceder a el.
Ojo con servlet estas configuraciones también se pueden hacer desde clases java tambien.
Configuramos el filtro de seguridad
Aquí simplemente tenemos que crear una clase que herede de AbstractSecurityWebApplicationInitializer. Esta clase si observamos no es un filtro si no un inicializador del contexto de aplicación, que se engancha a nuestro contexto compartido que hemos establecido en el apartado anterior. (Pero al final lo que se configura es un filtro (springSecurityFilterChain) para los temas de la seguridad).
package org.dbp.conf; import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { }
Enganchar la configuración de seguridad, a la de nuestra aplicación
En este caso es muy fácil simplemente tenemos que establecer, la importación de la configuración. @Import(SeguridadConfig.class)
Resultado
Una vez realizados los siguientes cambios, que ademas se adaptan adecuadamente a los artículos anteriores, el sistema nos pondrá una pagina de login estándar sin maquetación, para logarse. Aparte según la documentación de spring tendremos las siguiente configuraciones por defecto.
- Requiere autenticación, por cada URL.
- Crear el formulario de login.
- tiene un logout.
- Prevención de los ataques CSRF-
- Protecion a (Session Fixation).
- Integración de la seguridad con la cabecera....
- Se integran métedo del api Servlet.
- getRemoteUser.
- getUserPrincipal
- isUserInRole
- login
- logout
No hay comentarios:
Publicar un comentario