Bienvenido a re-orientation! Esperamos que encuentres lo que buscas

El security-context.xml. Configuración de Spring Security


Parte del manual paso a paso para desarrollar una aplicación web con Spring Framework + Spring Security contra una base de datos MySQL.

Llegados a este punto, ya hemos introducido las dependencias a los módulos de Spring Security y especificado a nuestra aplicación donde encontrar la configuración de seguridad; sólo nos queda pendiente configurar el framework a través de nuestro fichero security-context.xml

Configurando las restricciones de acceso

En nuestro caso, para securizar las URLs usaremos expresiones, lo que indicaremos declarando el atributo use-expressions en del elemento <http> a true.

 <http use-expressions="true">

Las restricciones concretas de acceso las especificamos con los atributos access en los elementos <intercept-url> asociados, como se muestra en el ejemplo siguiente:

<intercept-url pattern="/img/**" access="permitAll" />
<intercept-url pattern="/css/**" access="permitAll" />
<intercept-url pattern="/index.htm" access="permitAll" />
<intercept-url pattern="/secured/**" access="authenticated" />

En el bloque anterior estamos permitiendo el acceso las imágenes y los estilos (permitAll). La única ruta http de una página web a la que permitimos acceder es index.htm; todas las demás peticiones de recursos estarán bajo restricciones de acceso.

Un detalle relevante del ejemplo, es que además de restringir el acceso a usuarios autenticados, se enmascaran las urls, o lo que es lo mismo: todos los recursos solicitados estarán dentro de la ruta raíz /secured/.

Spring Security nos brinda numerosas posibilidades a la hora de restringir los accesos. Por ejemplo, si quisiéramos que sólo pudieran acceder los usuarios con un determinado rol o un sub-conjunto concreto de roles, bastaría con indicar en el atributo access los roles permitidos: <intercept-url pattern="/secured/**" access="hasAnyRol('ROLE_STAFF','ROLE_ADMIN')" />

Con el elemento <form-login> indicamos que una vez autenticado el usuario en la aplicación, procedente del formulario de login estándar, sea redirigido al recurso "/secured/acces.htm" en todos los casos:

<form-login login-page="/index.htm" default-target-url="/secured/acces.htm" always-use-default-target="true" />

El recurso access.htm nos será útil para discriminar posteriormente a que página enviaremos a los usuarios en función de sus roles, lo veremos más adelante, cuando tratemos la capa controladora.

Por último, indicaremos en este bloque a qué recurso será redirigido el usuario en caso de invalidez de la sesión:

<logout invalidate-session="true" logout-success-url="/index.htm" />

Creando un proveedor de autenticación personalizado

Ahora vamos a realizar algunos cambios a la configuración de Spring Security que no serían necesarios si usáramos la configuración estándar. En nuestro caso son necesario debido a que vamos a recuperar, en el proceso de autenticación, la información adicional que introducimos en el modelo de datos que preparamos para el ejemplo (la información adicional de la tabla USERS).

Para esto, registraremos un proveedor de autenticación personalizado. Crearemos el nuevo bean customJdbcDaoImpl usando un elemento de tipo <authentication-provider> dentro de nuestro <authentication-manager>.

<authentication-manager alias="authenticationManager">
  <authentication-provider user-service-ref="customJdbcDaoImpl">
         <password-encoder ref="passwordEncoder" />
  </authentication-provider>
</authentication-manager>

Con el proveedor de autenticación también declaramos (en el bean passwordEncoder) el algoritmo de hash que vamos a implementar para codificar las claves de los usuarios en la BDD.

<beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
   <beans:constructor-arg value="256" />
   <beans:property name="encodeHashAsBase64" value="true" />
</beans:bean>

Por último, en el bean customJdbcDaoImpl, declaramos la clase CustomJdbcDaoImpl, que es donde finalmente vamos a implementar nuestra consulta personalizada de acceso. Posteriormente crearemos la clase concreta bajo la ruta que hemos declarado: com.reor.app01.security.CustomJdbcDaoImpl.

<beans:bean id="customJdbcDaoImpl" class="com.reor.app01.security.CustomJdbcDaoImpl"> 
   <beans:property name="dataSource" ref="dataSource" />
</beans:bean> 

En el bloque anterior además especificamos la fuente de datos que vamos a usar; haciendo referencia al datasource en cuestión. Nuesto dataSource está aún pendiente de declarar, lo trataremos posteriormente en detalles, cuando creemos el archivo datasource-config.xml.

El fichero security-context.xml ya completado quedaría así:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    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.1.xsd">

    <http use-expressions="true">
    	<intercept-url pattern="/js/**" access="permitAll" />
		<intercept-url pattern="/img/**" access="permitAll" />
		<intercept-url pattern="/css/**" access="permitAll" />
		<intercept-url pattern="/index.htm" access="permitAll" /> 
		<intercept-url pattern="/secured/**" access="authenticated" />
        <form-login login-page="/index.htm" default-target-url="/secured/access.htm" always-use-default-target="true" />
		<logout invalidate-session="true" logout-success-url="/index.htm" />
        <session-management session-fixation-protection="migrateSession"></session-management>
    </http>
	<authentication-manager alias="authenticationManager">
		<authentication-provider user-service-ref="customJdbcDaoImpl">
			<password-encoder ref="passwordEncoder" />
		</authentication-provider>
	</authentication-manager>

	<beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
		<beans:constructor-arg value="256" />
		<beans:property name="encodeHashAsBase64" value="true" />
	</beans:bean>
	
	<beans:bean id="customJdbcDaoImpl" class="com.reor.app01.security.CustomJdbcDaoImpl"> 
    	<beans:property name="dataSource" ref="dataSource" />
  	</beans:bean> 	
  	
</beans:beans>

Para más información: http://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html

Terminos Tecnología: