Controllo degli accessi web in Java

JavaSpesso è necessario proteggere in parte o tutta un’applicazione tramite la classica combinazione utente/password. Per chi proviene da PHP, Perl o altri ambienti di scripting questa richiesta solitamente viene seguita dalla ricerca e utilizzo di qualche libreria esistente o, in alcuni casi, con la scrittura di codice ad hoc. In java non è così, la cosiddetta “container-managed authentication” fa parte dello standard JEE (Java Enterprise Edition); queste regole si traducono in vere e proprie API di programmazione e da specifiche di configurazione delle applicazioni, in modo che sia possibile proteggere le applicazioni semplicemente modificando dei file di configurazione, senza dover implementare nulla.

Una sezione di amministrazione

Moltissime applicazioni hanno una sezione dedicata all’amministrazione: creazione e modifica degli utenti, configurazione, manutenzione, eccetera; questa sezione è normalmente visibile solamente ad una ristretta cerchia di addetti, che vi accedono tramite password. Esempio di configurazione:

  • tutte le risorse pubbliche del sito (pagine, servlet, immagini, css, ecc.) accessibili da chiunque;
  • per accedere alle risorse che hanno un path che comincia per /admin/* bisogna prima effettuare una login.

Chiariamo subito un aspetto importante: tutte le specifiche definite come “container-managed”, fra cui la sicurezza, indicano cosa si aspetta l’applicazione in termini di servizi dall’ambiente in cui gira (il container appunto), ma non come questi verranno implementati. Nell’esempio che vedremo sarà utilizzata una funzionalità specifica di Tomcat, ma la stessa applicazione potrà girare senza alcuna modifica sullo stesso Tomcat configurato in maniera diversa, su application server com JBoss o Weblogic, ecc.

Configurazione dell’applicazione

Per prima cosa bisogna modificare il file WEB-INF/web.xml, aggiungendo queste righe:

[xml]<!– Security constraint per la sezione di amministrazione –>
<security-constraint>
<web-resource-collection>
<web-resource-name>Amministrazione</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>administrator</role-name>
</auth-constraint>
</security-constraint>

<!– Configurazione del metodo di login –>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Sezione di amministrazione</realm-name>
</login-config>[/xml]

In questo modo, ogni volta che si cercherà di accedere ad una pagina, una servlet o altro sotto il path /admin/, il browser mostrerà una finestra di dialogo per l’inserimento della password.

Configurazione di Tomcat

Vediamo ora una delle possibili implementazioni della sicurezza, ovvero tramite la configurazione di Tomcat. Aprire il file tomcat-users.xml, che si trova nella directory conf dove Tomcat è installato, e aggiungere l’utente admin con questa riga di XML:

[xml]<user name="admin" password="segreta" roles="administrator"/>[/xml]

Dopo aver riavviato, dovreste essere in grado di accedere alle pagine sotto /admin/ usando “admin” come nome utente e “segreta” come password.

Ovviamente questa soluzione è applicabile solamente a Tomcat, inoltre è decisamente poco scalabile e manutenibile!

Sviluppi

Ci sono molti modi per configurare l’autenticazione nelle web application Java, ad esempio con Tomcat è possibile utilizzare un database d’appoggio tramite JDBC, accedere a LDAP, addirittura è possibile creare un proprio provider per l’autenticazione per gestire casi decisamente specializzati, e lo stesso con tutti i JEE container, siano essi semplici servlet container che veri e propri stack JEE.

Linkografia

  • Realm Configuration HOW-TO: documentazione di Tomcat relativa ai servizi di autenticazione container-managed;
  • The Java EE 6 Tutorial – Securing Web Applications.

Condividi