Introduzione
Spring Security è un framework del progetto Spring che consente di gestire in modo semplice e trasparente l’autenticazione (ovvero chi sei) e la profilazione (ovvero cosa sei autorizzato a fare) degli utenti che accedono ad una applicazione web. In realtà il framework non si limita solamente a questo, infatti Spring Security implementa anche tutta una serie di funzionalità che consentono di fare fronte a molte delle tipiche vulnerabilità di un’applicazione web e che sono ben descritte dal progetto OWASP nella sua Top 10, in particolare:
- Protezione da attacchi CSRF;
- Prevenzione della Session Fixation;
- Implementazione delle policy di HTTP Strict Transport Security;
- Implementazione delle opzioni X-Content-Type-Options per la prevenzione degli attacchi basati su MIME-type confusion;
- Controllo dell’uso della Cache;
- Protezione dagli attacchi X-XSS;
- Integrazione delle opzioni X-Frame-Options per prevenire attacchi Clickjacking.
Il Progetto
Introduciamo i concetti fondamentali di Spring Security implementando una semplice applicazione web composta da una sole pagine, index.jsp
che intendiamo securizzare. Per il set-up del progetto, seguiamo le istruzioni descritto nel tutorial Creare una Web Application con Maven, ed utilizziamo il comando Maven:
1 2 3 4 5 |
mvn archetype:generate -DgroupId=it.javaboss -DartifactId=spring-security -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false |
Quindi eseguiamo le semplici operazioni correttive descritte nell’articolo citato per ottenere il progetto di base, che si compone dei soli file web.xml
, index.jsp
e pom.xml
.
Verifichiamo il corretto funzionamento della web application eseguendone il deploy su Tomcat (che nel frattempo avremo configurato sul nostro Eclipse) e inserendo l’url http://localhost:8080/spring-security/ nel browser. Se tutto è andato bene dovrebbe essere visualizzato il caratteristico messaggio: Hello World!
Configurazione
Dipendenze
Innanzitutto inseriamo nel pom.xml
le dipendenze minime necessari per utilizzare Spring Security:
1 2 3 4 5 6 7 8 9 10 |
<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> |
La configurazione di Spring Security può essere realizzata attraverso Java Config (Spring JavaConfig (parte 1)) oppure utilizzando il tradizionale Spring XML application context. Scegliamo questa seconda opzione e seguiamo quando descritto nella documentazione ufficiale al paragrafo Security Namespace Configuration.
web.xml
Modifichiamo il file web.xml
dichiarando il filtro DelegatingFilterProxy
che collega l’applicazione web all’infrastruttura di Spring Security. Si noti che il nome del filtro springSecurityFilterChain
è riservato e non può essere utilizzato per la dichiarazione di una altro bean all’interno del contesto di Spring.
1 2 3 4 5 6 7 8 |
<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> |
Successivamente dobbiamo configurare l’applicazione in modo che venga caricato il contesto di Spring allo start-up. Configurazione che avviene utilizzando il tradizionale listener ContextLoaderListener
di Spring ed indicando come file XML di contesto tutti i file contenuti in una cartella spring
che andiamo a collocare all’interno della cartella WEB-INF
.
1 2 3 4 5 6 7 |
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/*.xml</param-value> </context-param> |
spring-security.xml
Per la configurazione di Spring Security è possibile utilizzare due diversi namespace definiti nella dipendenza spring-security-config
. il primo e classico namespace beans
definito nello schema http://www.springframework.org/schema/beans
oppure il namespace specifico security
definito nello schema http://www.springframework.org/schema/security
, e che ci consente di omettere il prefisso security
in tutti i tag del namespace.
Procediamo quindi con la seconda opzione e creiamo il file spring-security.xml
nella cartella WEB-INF/spring
, introducendo la configurazione minima affinché Spring Security venga attivato.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<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 /> <user-service> <user name="java" password="{noop}boss" authorities="ROLE_USER" /> </user-service> </b:beans> |
Il tag <html>
abilita la web security su tutti gli url, mentre <user-service>
consente di definire un servizio di autenticazione in memoria, con gli utenti specificati su file di properties
o direttamente all’interno del tag. Si noti che nell’attributo password
del tag <user>
la password (boss)
è preceduta da {noop}
che indica che la password non è encodata, ovvero è in chiaro. Ovviamente per la produzione questo è decisamente poco sicura.
Esecuzione dell’Applicazione
Completati gli step precedenti possiamo eseguire nuovamente l’applicazione su Tomcat ed inserire nel browser l’url http://localhost:8080/spring-security/. Questa volta non è visualizzato il messaggio di hello ma Spring Security ci mostra una (rudimentale) maschera di login.
L’accesso alla pagina index.jsp è autorizzato esclusivamente inserendo le credenziali con user java
e password boss
, ogni altra credenziale viene rigettata dal framework.
Codice Sorgente
Il codice sorgente completo degli esempi presentati è scaricabile qui spring-security.
Complimenti Massimo per gli ottimi articoli che ci regali. Nel presente articolo c’è una piccola distrazione….scrivi “Il tag abilita ….” invece che .
Grazie mille per la segnalazione, ho corretto immediatamente.