Spring MCV 3 e Spring Security 3 – Esempio 1
Questo è un esempio base che mostra come configurare Spring MVC per utilizzare Spring Security.
Il risultato finale
Spring Security, integrato con Spring MVC, permette di base di definire quali zone di un portale sono visualizzabili a seconda del ruolo associato all’utente collegato. In questo esempio c’è:
- un unico utente (nicola) ed un unico ruolo (ROLE_ADMIN) gestito
- una pagina /admin visibile solo da un utente con ruolo ROLE_ADMIN
Il menu si differenzia a seconda dell’avvenuta o no autenticazione. Nel caso di nessun utente collegato si presenta così:
Una volta effettuato l’accesso diventa così:
Una volta autenticati, nel menù è visibile il link alla pagina /admin e anche la possibilità di effettuare il logout.
Se si cerca di accedere alla pagina /admin senza avere eseguito l’autenticazione si viene rediretti alla pagina di login.
Versioni utilizzate
- Spring / Spring MVC: 3.2.10.RELEASE
- Spring Security: 3.2.4.RELEASE
- Tiles: 2.2.2
e le relative dipendenze Maven:
<!-- Spring 3 dependencies --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring security --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${spring.security.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${spring.security.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> <version>${spring.security.version}</version> </dependency> |
Configurazione
Web.xml
Nel file web.xml occorre specificare dove si trova il file di configurazione di Spring Security (contextConfigLocation), ed aggiungere un paio di listener ed un filtro:
<!-- Setup spring security --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring/applicationContext.xml classpath:spring/security-context.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> </listener> <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> |
Spring MVC
Questo è il file security-context.xml che configura il comportamento di Spring Security:
<?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.2.xsd"> <http auto-config="true" use-expressions="true"> <intercept-url pattern="/admin**" access="hasRole('ROLE_ADMIN')" /> <form-login login-page="/login" default-target-url="/" authentication-failure-url="/login?error" username-parameter="user" password-parameter="password"/> <logout logout-success-url="/login?logout" /> </http> <authentication-manager> <authentication-provider> <user-service> <user name="nicola" password="nicola" authorities="ROLE_ADMIN" /> </user-service> </authentication-provider> </authentication-manager> </beans:beans> |
Il tag http permette di configurare il comportamento del portale a seconda del ruolo dell’utente collegato o eventualmente anonimo:
<intercept-url pattern="/admin**" access="hasRole('ROLE_ADMIN')" /> |
In questo esempio indico a Spring Security che ogni pagina sotto /admin può essere acceduta solo da utente con ruolo ROLE_ADMIN
il tag form-login mappa la form di autenticazione, indicando:
- login-page=”/login”: la pagina dove si trova la form di login
- default-target-url=”/”: l’url a cui essere rediretti dopo il login se non specificato altrimenti
- authentication-failure-url=”/login?error”: l’url a cui essere rediretti in caso di errore di autenticazione
- username-parameter=”user”: il “name” della input text della form che contiene l’utente
- password-parameter=”password”/>: il “name” della input text della form che contiene la password
- logout logout-success-url=”/login?logout”: la pagina di atterraggio dopo il logout
Il Login e il Logout
Per effettuare il login Spring Security mette a disposizione questo url:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <c:url value='j_spring_security_check' /> |
che va inserito come action nella form.
Il relativo url per il logout è:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <c:url value="/j_spring_security_logout" /> |
I tags di Spring Security
Per verificare all’interno di una jsp che un utente si sia precedentemente autenticato, è sufficiente scrivere:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <!-- Mostra il link Login se nessuno si è ancora autenticato <sec:authorize access="isAuthenticated()"> ... </sec:authorize> |
mentre per controllare il ruolo di un utente:
<sec:authorize access="hasRole('ROLE_ADMIN')"> ... </sec:authorize> |
Il tutto, funzionante, può essere visto nell’esempio da scaricare.
Leave a Reply