Fonte: tomcat.apache.org
In un precedente tutorial abbiamo visto come usufruire degli strumenti che Tomcat ci mette a disposizione per gestire l’autenticazione degli utenti del nostro sistema.
In questa breve guida, invece, vedremo come “istruire” Tomcat a leggere i dati degli utenti (user name, password e ruoli) da un database.
I prerequisiti necessari sono essenzialmente due:
- Apache Tomcat 5.x
- MySQL 5.0 (anche se la configurazione per altri DBMS è molto simile)
Poiché sia Tomcat e MySQL sono multi-piattaforma, le istruzioni riportate di seguito saranno valide per diversi sistemi operativi (Linux, Windows, Mac, … ).
Per prima cosa dobbiamo scaricare i driver JDBC che MySQL ci mette a disposizione qui, scompattare l’archivio e copiare il file mysql-connector-java-x.x.x.x-ga-bin.jar nella directory $CATALINA_HOME/common/lib , dove per $CATALINA_HOME si intende il path della vostra installazione di Tomcat .
Dopo di che dobbiamo inserire nel database le tabelle che conterranno rispettivamente gli utenti e i ruoli delgi utenti del nostro sistema:
create table users ( user_name varchar(15) not null primary key, user_pass varchar(15) not null ); create table user_roles ( user_name varchar(15) not null, role_name varchar(15) not null, primary key (user_name, role_name) );
Ovviamente questo è solo un esempio, possiamo rinominare a piacimento tabelle e attributi, o aggiungerne altri.
Vi faccio notare inoltre che le password degli utenti verranno memorizzate in chiaro; sarebbe meglio fare un digest delle password (md5, etc …), ma questo esula gli scopi di questa guida.Fatto ciò, ci basta modificare il file $CATALINA_HOME/conf/server.xml nel seguente modo:
...
<!--
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
-->
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/nome_db"
connectionName="test" connectionPassword="test"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
...
Non abbiamo fatto altro che commentare il Realm di default (righe 3-6) e inserire un nuovo Realm (righe 8-13) , lasciando inalterato il resto del file.Per ulteriore chiarezza descriverò i principali attributi del nuovo Realm:
- connectionURL indica il percorso del nostro database; al posto di nome_db dovete inserire il nome del vostro database dove avete creato le due tabelle
- in connectionName e connectionPassword dovrete inserire le credenziali per l’accesso al suddetto db
- in userTable e userRoleTable inserire rispettivamente il nome della tabella degli utenti e della tabella dei ruoli
- intuitivamente in userNameCol, userCredCol e roleNameCol è necessario inserire i nomi delle rispettive colonne
Ora non ci resta che riavviare Tomcat e verificare se tutto è andato per il verso giusto.
Filed under: Apache Tomcat, Java | 19 Comments
Tags: Apache Tomcat, Autenticazione, DBMS, Java, JDBC, JSP, MySQL, Realm, Web

a me non ha funzionato…
Potresti dirmi dove hai avuto problemi, faresti un favore a te stesso, perchè magari potrei aiutarti a risolvere, e un favore a me, che potrei eventualmente correggere qualche errore.
Deployment error:
Access to Tomcat server has not been authorized. Set the correct username and password with the “manager” role in the Tomcat customizer in the Server Manager.
E’ un po troppo generica come risposta, cerca di essere più preciso.
Di primo acchito mi verrebbe da dire che non hai assegnato un ruolo manager o non hai configurato bene il realm.
Chiedo scusa ma c’è stato il mio errore : nel DB deve esistere anche un utente (finto) con ruolo “manager”. Grazie per la sua disponibilità . Già che ci sono posso fare una domanda : una volta che l’utente è autenticato come viene riconosciuto dopo nell’applicazione (Tomcat crea qualche sessione , scrive in un file .xml)?
Si, esattamente! dopo il login tomcat apre una sessione (ha un timeout ed è possibile anche chiuderla).
Mi fa piacere che tu abbia risolto, non mi resta che augurarti buon Tomcat
Ciao, sto imparando qualcosina di tomcat e ho seguito entrambe le tue guide (dopo averne seguite altre…).
Continuo ad avere sempre lo stesso problema…ti descrivo la situazione…
ho un DB con due tabelle identiche a quelle create da te e riempite così:
users:
user_name: prova
user_pass: prova
user_roles:
user_name: prova
role_name: admin
uso postgresql e ho aggiunto il driver (anche se non ho la directory common:”$CATALINA_HOME/common/lib” ma ho direttamente lib:$CATALINA_HOME/lib ).
seguendo alla lettera il tutorial ho preparato i file server.xmle web.xml della mia applicazione.
Il problema è che qualsiasi nick e pass io inserisca, anche quelli del db, vengo sempre rimandato alla pagina di errore LoginError.jsp.
Hai qualche idea?
Ma non hai riempito il campo ruoli. Per poter effettuare l’accesso, l’utente deve avere il ruolo corrispondente (nel DB) a quello da te assegnato nella (vedi la guida: Autenticazione su Apache Tomcat).
Spero di esserti stato d’aiuto.
Ciao, intanto grazie per la risposta….
sul web.xml ho
admin
adminArea
/secure/*
admin
e sul db nella tabella “user_role” l’utente “prova” ha come role_name “admin”…
non riesco a capire cosa manchi…
Ti dirò di più però… credo a questo punto che sia un problema più grosso perchè non riesco ad autenticarmi neanche sulla pagina del manager di apache(anche avendo aggiunto l’user con credenziali manager…).
Illuminami…
grazie…
Hai dato un occhio ai logs? Magari fallisce proprio la comunicazione con il DB.
Il file di log dovrebbe essere $CATALINA_HOME/logs/catalina.out o qualcosa di simile.
Dimenticavo: nel realm hai cambiato queste due stringhe
driverName=”org.gjt.mm.mysql.Driver”
connectionURL=”jdbc:mysql://localhost/nome_db”
con quelle di postgreSQL?
e hai inserito i driver di postgreSQL nella cartella $CATALINA_HOME/common/lib ?
si,i driver ci sono e sono nella cartella corretta, su tomcat 6 la cartella non è $CATALINA_HOME/common/lib ma $CATALINA_HOME/lib.
ho cambiato quelle due stringhe nel realm.
Come ti dicevo credo che il problema sia un altro… ora riinstallo tomcat e provo a vedere se riesco ad entrare dentro al manager intanto…visto che nemmeno su quello riuscivo ad entrare.
P.S: io uso netbeans(obblighi del docente universitario) se vado sotto services e sotto Apache Tomcat, nelle proprietà posso scegliere di vedere il file server.xml… ma non mi fa vedere quello che io edito nella $CATALINA_HOME/conf/server.xml…
mi fa vedere un file bello pulito… che possa esser questo il problema? devo forse modificare questo?
Grazie grazie…
NetBeans (se si comporta come Eclipse) non richiama il file di configurazione in catalina_home, ma se ne crea uno.
Sicuramente devi modificare il file che ti propone netBeans, se lanci tomcat da li.
P.S.
Ho trovato una guida per settare correttamente il realm di postgreSQL:
http://richardbrenner.com/joomla/index.php?option=com_content&task=view&id=57&Itemid=
quella è una delle guide che avevo seguito…
comunque il problema è quello là, dovevo editare l’xml di netbeans e non quello in /conf…
Ora mi son incasinato la vita perchè ho cambiato la pass del manager che si era creato il netbeans… e mi dice “Access to Tomcat server has not been authorized. Set the correct username and password with the “manager” role in the Tomcat customizer in the Server Manager.”
il problema è che se non entro nel server manager, non posso settare l’user…
Puoi sempre modificare i file di configurazione a manina invece che da interfaccia web
infatti è quel che sto facendo ora…
ho eliminato il vecchio server che c’era su e ho buttato su un tomcat6 lindo risettando pass e varie. E sono riuscito ad entrare nel manager. Bene dirai tu… e invece no!
perchè lo step successivo è mettere l’accesso a sto benedetto DB per prendere le credenziali… quindi levo il realm originale dell’engine e metto il mio realm…
nelle tabelle del DB c’è un user “ide” pass “123″ con role “manager” che corrisponde esattamente alle credenziali d’accesso al web manager… ma niente… mi da l’errore di prima…
Hai visto i logs?
P.S.
Ti consiglio, per adesso, di mettere da parte NetBeans e provare la configurazione direttamente sulla macchina; dopo settarlo su NetBeans, avendo il file di conf corretto, non sarà cosi difficile.
riiiiiiiiisolto!
grazie della collaborazione! 
Ora avevo semplicemente un problema di permessi sul db…
Ti consiglio di aggiungere alla guida un postilla dove dici che in caso di Eclipse o Netbeans i file di conf non sono quelli standard…il mio problema alla fine era tutto là… In realtà è possibile settare il server affinchè carichi quelli standard.
Se ti interessa aggiornarla a Tomcat 6, l’unica cosa che cambia è il path dei file di conf.
Allego il codice per il postgres:
Realm className=”org.apache.catalina.realm.JDBCRealm”
driverName=”org.postgresql.Driver”
connectionURL=”jdbc:mysql://:port/”
connectionName=”postgres” connectionPassword=”"
userTable=”users” userNameCol=”user_name” userCredCol=”user_pass”
userRoleTable=”user_roles” roleNameCol=”role_name”
Grazie ancora!
Figurati, è stato un piacere.
Quando avrò un po più di tempo aggiornerò.
Buon Tomcat e in bocca al lupo per gli esami!