Publicado el 21 de Enero del 2019
674 visualizaciones desde el 21 de Enero del 2019
599,7 KB
19 paginas
Experto Universitario Java Enterprise
Spring
Sesión 7: Seguridad con Spring
Security
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
1
Experto Universitario Java Enterprise
Indice
• Configuración básica
• Autentificación contra una base de datos
• Personalización de la seguridad web
• Seguridad de la capa de negocio
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
2
Experto Universitario Java Enterprise
Spring Security
• Subproyecto de Spring (no es parte del core framework)
• ¿Por qué esto si ya la seguridad está implementada en JavaEE estándar?
• Ciertos mecanismos están estandarizados, pero otros dependen del servidor de aplicaciones,
básicamente el enlace entre la aplicación y las “fuentes de autorización” (BD, LDAP,
certificados)
• Una aplicación con Spring Security es más portable que una estándar (!)
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
3
Experto Universitario Java Enterprise
Configuración mínima para aplicación
web
• Añadir las dependencias de Spring Security
• Modificar el web.xml para que Spring Security intercepte las peticiones a la
aplicación y pueda controlar el acceso
• Crear un fichero de configuración XML para la seguridad
•
Indicar en el web.xml dónde está este archivo
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
4
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>3.1.3.RELEASE</version></dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>3.1.3.RELEASE</version></dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>3.1.3.RELEASE</version></dependency>
Experto Universitario Java Enterprise
Configuración mínima para aplicación web (II)
• Spring Security debe interceptar las peticiones para poder controlar el acceso
• Se usan filtros de servlets
• Decirle a Spring dónde está el fichero de configuración de seguridad
• Es un fichero de configuración de beans “estándar”
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
5
<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><context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring/root-context.xml /WEB-INF/spring/security-context.xml </param-value></context-param><listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class></listener>
Experto Universitario Java Enterprise
Configuración mínima para aplicación web (III)
• Crear el fichero de configuración de seguridad
• Es un fichero de configuración de beans típico de Spring, pero básicamente contendrá
etiquetas de seguridad
• También podríamos meter las etiquetas en el fichero de configuración “principal” de la
aplicación
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
6
<?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <http auto-config="true"> <intercept-url pattern="/**" access="ROLE_USER" /> </http> <authentication-manager alias="authenticationManager"> <authentication-provider> <user-service> <user authorities="ROLE_USER" name="guest" password="guest" /> </user-service> </authentication-provider> </authentication-manager></beans:beans>
Experto Universitario Java Enterprise
Autentificación contra una base de datos
• Cambiar el authentication manager
• Esta es una versión inicial, solo sirve si se usa el esquema de BD por defecto
(ahora veremos cuál es)
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
7
<authentication-manager alias="authenticationManager"> <authentication-provider> <jdbc-user-service data-source-ref="miDataSource"/> </authentication-provider></authentication-manager> <!-- datasource, como siempre que nos queremos conectar a una BD en Spring --><jee:jndi-lookup id="miDataSource" jndi-name="jdbc/securityDS" resource-ref="true"/>
Experto Universitario Java Enterprise
Cómo obtiene spring usuarios/roles
• Se supone un esquema de BD “por defecto” y se hacen 2 queries SQL, una para
comprobar el password y otra para obtener los roles
• Si tenemos otro esquema distinto, será cuestión de “montar” 2 queries que
devuelvan los resultados con el formato que espera Spring
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
8
SELECT username, password, enabled FROM users WHERE username = ? SELECT username, authority FROM authorities WHERE username = ?SELECT login as username, password, true as enabled FROM usuarios WHERE login=? SELECT login as username, rol as authority FROM roles WHERE login=?
Experto Universitario Java Enterprise
En el fichero de configuración...
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
9
<authentication-manager alias="authenticationManager"> <authentication-provider user-service-ref="miUserServiceJDBC" /></authentication-manager> <beans:bean id="miUserServiceJDBC" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> <beans:property name="dataSource" ref="miDataSource"/> <beans:property name="usersByUsernameQuery" value="SELECT login as username, password, true as enabled FROM usuarios WHERE login=?"/> <beans:property name="authoritiesByUsernameQuery" value="SELECT login as username, rol as authority FROM roles WHERE login=?"/> </beans:bean> <jee:jndi-lookup id="miDataSource" jndi-name="jdbc/securityDS" resource-ref="true"/>
Experto Universitario Java Enterprise
Personalización de la seguridad
• Con la configuración anterior, Spring nos da un formulario de login auto-generado
• Usar nuestro propio formulario de login
• Fichero de configuración
•
¡Acordarse de desproteger el acceso al formulario!
• HTML del formulario, muy similar al estándar
• En el estándar no se puede ir directamente a la URL del formulario, lo que nos obliga al “truco”
de ir a una URL protegida para forzar el salto al formulario. Aquí no hace falta eso
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
10
<http pattern="/login.html" security="none"/> <http> <intercept-url pattern="/**" access="ROLE_REGISTRADO, ROLE_ADMIN" /> <form-login login-page="/login.html" default-target-url="/main.html" /></http><form action="j_spring_security_check" method="post"> Usuario: <input type="text" name="j_username"/> <br/> Contraseña: <input type="password" name="j_password"/> <br/> <input type="submit" value="Entrar"/></form>
Experto Universitario Java Enterprise
Otras ”mejoras”
• Logout
• Remember-me: no tenemos que hacer login cada vez que accedamos, se guarda
en el navegador
• No se guarda login/password, sino un token de acceso (hash md5 a partir de
login,password,clave de la aplicacion, fecha expiración)
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
11
<http> ... <logout logout-url="/logout" logout-success-url="/adios.jsp"/></http><!--borrará la sesión y saltará a “adios.jsp” --><a href="logout">Logout</a><http> ... <remember-me key="claveDeLaAplicacion"/></http><!-- añadir este campo al formulario de login --><input type="checkbox" name="_spring_security_remember_me"/> Recordarme en este ordenador
Experto Universitario Java Enterprise
Autentificación basic vs. formulatio
• BASIC es apropiado para clientes REST/Acceso remoto
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
12
<!-- servicios REST sin estado con autentificación Basic --><http pattern="/restful/**" create-session="stateless"> <intercept-url pattern='/**' access='ROLE_REMOTE' /> <http-basic /></http> <!-- Desproteger la página de login--><http pattern="/login.html" security="none"/> <!-- Clientes web con autentificación basada en formulario --><http> <intercept-url pattern='/**' access='ROLE_USER' /> <form-login login-page='/login.html' default-target-url="/home.html"/> <logout /></http>
Experto Universitario Java Enterprise
Seguridad de “grano fino” en los JSP
• Dependencia de una librería adicional
• Tomamos una URL “de referencia”. Si el usuario actual puede acceder a ella, el
contenido del tag se mostrará
Seguridad con Spring Security
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
13
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> <version>3.1.3.RELEASE</version></dependency><%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>...<sec:authorize url="/admin/eliminar"> <a href="/admin/eliminar">Eliminar</a></sec:authorize>
Experto Universitario Java Enterprise
Seguridad de “grano fino” en los JSP
• También se pueden usar expresiones SpEL
• hasRole(rol)
• hasAnyRole(rol1,rol2,...)
•
•
Comentarios de: Sesión 7: Seguridad con Spring Security (0)
No hay comentarios