Springmvc Security Intro
Springmvc Security Intro
Nota:
En las 2 secciones dedicadas a la seguridad, continuaremos con el proyecto terminado hasta la
sección anterior: “Integración de Spring MVC y Spring Data JPA”.
Estas dos secciones dedicadas a la seguridad no llevan secuencia. Puedes ver las siguientes 2 secciones en el
orden que tu desees.
En ambas secciones continuaremos con el proyecto descargado de la lección anterior:
cineapp-sin-seguridad.zip Proyecto terminado con toda la funcionalidad, PERO SIN SEGURIDAD.
¿Qué es Spring Security?
Es un framework de seguridad (módulo de Spring) que permite aplicar
seguridad a tus aplicaciones desarrolladas con Spring.
En este curso veremos como aplicar Seguridad en Aplicaciones Web.
Spring Security aplica 2 tipos de seguridad:
Autenticación: ¿Es un usuario válido para acceder a la aplicación?
Autorización: ¿El usuario tiene permisos (ROL) para acceder al recurso
solicitado?
La seguridad es aplicada a nivel de Petición Web (HTTP Request) y a
nivel de Invocación de Métodos.
Spring Security esta basado en Spring Framework. Internamente utiliza:
Inyección de Dependencias (DI)
Programación orientada a aspectos (AOP).
En aplicaciones web Spring Security utiliza Servlet Filters para aplicar
seguridad a las peticiones web y restringir el acceso a nivel de URL.
Spring Security – Servlet Filter
Spring Security utiliza varios Servlet Filters para filtrar las peticiones web.
Los Servlet Filters son componentes (Interceptors) ejecutados antes (pre-process) y despúes
(post-process) de la petición web.
HTTP 403
Acceso Denegado
2
La petición es Interceptada
por el Servlet Filter NO
1 4
HTTP Request 3 5
/peliculas/index ¿Es un SI SI
¿Usuario ¿Usuario
recurso
autenticado? autorizado?
protegido?
Web
Continuar procesamiento
Browser normal de la petición NO NO
SI
Mostrar Login
Spring Form
Security
Filters
Verificar
Usuario / Password
(Database)
<dependency>
<groupId>org.springframework.security</groupId> Spring Security
<artifactId>spring-security-taglibs</artifactId>
<version>5.2.0.RELEASE</version> Tag (JSPs)
</dependency>
<!-- (you don't need this if you are using a .RELEASE version) -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository> Spring Security
</repositories>
https://spring.io/projects/spring-security
Configuración de Spring Security (1)
Servlet Filter (web.xml)
<!-- Spring Security Filter -->
<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>
<b:beans xmlns="http://www.springframework.org/schema/security"
xmlns:b="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.xsd Con esta configuración:
http://www.springframework.org/schema/security Será requerida autenticación
http://www.springframework.org/schema/security/spring-security.xsd"> para todas las URLs.
Spring generará un formulario
<http />
HTML de login de forma
<authentication-manager> automática.
Se crearán 2 usuarios en
<authentication-provider> memoria con los roles
<user-service> especificados.
<user name="luis" password=“{noop}luis123" authorities="EDITOR" /> Se agregará CSRF attack
<user name="marisol" password=“{noop}mari123" authorities="GERENTE" /> prevention (Cross-site request
</user-service>
forgery).
</authentication-provider>
</authentication-manager>
</b:beans>
Spring Security – Especificar autorización por ROL.
Los tags <intercept-url> son declarados dentro del tag <http> y son utilizados para definir conjuntos de URLs que
estarán protegidas en la aplicación. Los atributos más usados son:
pattern: sirve para indicar un patrón de URLs. Ejemplo:
/peliculas/*: Todas las URLs que comiencen con /peliculas/ ( /peliculas/index, /peliculas/create, /peliculas/save, etc. )
access: especificar atributos de acceso: Ejemplo:
access=“hasAnyAuthority('EDITOR')”: Permitir el acceso ÚNICAMENTE a usuarios con el ROL EDITOR.
<b:beans xmlns="http://www.springframework.org/schema/security"
xmlns:b="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.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<http auto-config="true">
<!-- Declaramos todos los recursos que estaran protegidos -->
<intercept-url pattern="/peliculas/*" access="hasAnyAuthority('EDITOR')" />
<intercept-url pattern="/horarios/*" access="hasAnyAuthority('EDITOR')" />
<intercept-url pattern="/noticias/*" access="hasAnyAuthority('EDITOR')" />
<intercept-url pattern="/banners/*" access="hasAnyAuthority('GERENTE')" />
</http>
. . .
</b:beans>
Controlador para cerrar la sesión
El objeto request es necesario para que Implementación de Spring Security
Spring obtenga la sesión actual para encargada de destruir la sesión.
invalidarla.
Controller
@GetMapping(value="/logout")
public String logout(HttpServletRequest request){
SecurityContextLogoutHandler logoutHandler =
new SecurityContextLogoutHandler();
return "redirect:/login";
}