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ì:

Spring MVC - Spring Security - menù per utente anonimo
Spring MVC – Spring Security – menù per utente non autenticato

Una volta effettuato l’accesso diventa così:
Spring MVC - Spring Security - menù per utente autenticato
Spring MVC – Spring Security – menù per utente autenticato

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

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>