Nel seguente post vediamo come realizzare un sistema di
profilatura utente basandoci sulle possibilità di configurazione di sicurezza
lato web.xml.
L’obbiettivo è avere a disposizione su una base dati la
lista degli utenti e dei ruoli e chiedere l’autenticazione utente per
proteggere l’accesso indesiderato alle pagine del nostro sito.
Come application server ho usato tomcat versione 7.0.19,
come database MySql versione 5.5.12.
Nell’esempio di test vediamo una sola pagina con due link e
2 ruoli, uno di amministratore ed uno di visualizzatore.
L’amministratore li visualizza entrambi, il visualizzatore soltanto uno.
Lato web.xml dobbiamo quindi inserire le seguenti
configurazioni
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Autenticazione Servizio
Profilatura</realm-name>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>restricted
methods</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>ADMIN</role-name>
<role-name>VIS</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>ADMIN</role-name>
</security-role>
<security-role>
<role-name>VIS</role-name>
</security-role>
In questo caso utilizziamo l’autenticazione di tipo BASIC
(comparirà la maschera di pop up del browser chiedendo le credenziali).
Abbiamo stabilito nel security constraint che tutte le
pagine dell’applicativo saranno sottoposte a sicurezza (nodo url-pattern) e che
i metodi sottoposti a sicurezza saranno sia il GET che il POST.
I ruoli che possono accedere alle pagine (nodo
auth-constraint) sono due, ADMIN e VIS (specificati poi come security role).
Si noti che se non si mette il nodo auth-constraint nessuno
sarà abilitato a vedere nulla sull’applicazione e comparirà sempre l’errore http
403 (access forbidden).
A questo punto scriviamo anche la jsp con i due link per
testare i ruoli.
Il codice è il seguente:
<%@ page
language="java" contentType="text/html;
charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib
uri="http://java.sun.com/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Profilatura</title>
</head>
<body>
<% if(request.isUserInRole("ADMIN")){ %>
<a href="jsp/InserisciUtente.jsp"
>Inserisci Utente</a>
<% } %>
<br>
<a href="jsp/GestioneUtenti.jsp"
>Gestioni Utente</a>
</body>
</html>
Con il metodo request.isUserInRole possiamo accedere al
ruolo dell’utente e soltanto l’amministratore potrà visualizzare il link “Inserisci
Utente”.
A questo punto dobbiamo creare il nostro data base.
Lo script per la creazione del db, che si compone di 3
tabelle , una utenti una ruoli ed una associativa utenti ruoli.
Di seguito lo script:
CREATE DATABASE IF NOT EXISTS tomcat_realm;
USE tomcat_realm;
--
-- Definition of table `tomcat_roles`
--
DROP TABLE IF EXISTS `tomcat_roles`;
CREATE TABLE `tomcat_roles` (
`role_name` varchar(20) NOT NULL,
PRIMARY KEY (`role_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `tomcat_roles`
--
/*!40000 ALTER TABLE `tomcat_roles` DISABLE KEYS */;
INSERT INTO `tomcat_roles` (`role_name`) VALUES
('ADMIN'),
('VIS');
/*!40000 ALTER TABLE `tomcat_roles` ENABLE KEYS */;
--
-- Definition of table `tomcat_users`
--
DROP TABLE IF EXISTS `tomcat_users`;
CREATE TABLE `tomcat_users` (
`user_name` varchar(20) NOT NULL,
`password` varchar(32) NOT NULL,
PRIMARY KEY (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `tomcat_users`
--
/*!40000 ALTER TABLE `tomcat_users` DISABLE KEYS */;
INSERT INTO `tomcat_users` (`user_name`,`password`) VALUES
('kermit','thefrog'),
('sfigato','sfigato');
/*!40000 ALTER TABLE `tomcat_users` ENABLE KEYS */;
--
-- Definition of table `tomcat_users_roles`
--
DROP TABLE IF EXISTS `tomcat_users_roles`;
CREATE TABLE `tomcat_users_roles` (
`user_name` varchar(20) NOT NULL,
`role_name` varchar(20) NOT NULL,
PRIMARY KEY (`user_name`,`role_name`),
KEY `tomcat_users_roles_foreign_key_2` (`role_name`),
CONSTRAINT `tomcat_users_roles_foreign_key_1` FOREIGN KEY (`user_name`) REFERENCES `tomcat_users` (`user_name`),
CONSTRAINT `tomcat_users_roles_foreign_key_2` FOREIGN KEY (`role_name`) REFERENCES `tomcat_roles` (`role_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `tomcat_users_roles`
--
/*!40000 ALTER TABLE `tomcat_users_roles` DISABLE KEYS */;
INSERT INTO `tomcat_users_roles` (`user_name`,`role_name`) VALUES
('kermit','ADMIN'),
('sfigato','VIS');
USE tomcat_realm;
--
-- Definition of table `tomcat_roles`
--
DROP TABLE IF EXISTS `tomcat_roles`;
CREATE TABLE `tomcat_roles` (
`role_name` varchar(20) NOT NULL,
PRIMARY KEY (`role_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `tomcat_roles`
--
/*!40000 ALTER TABLE `tomcat_roles` DISABLE KEYS */;
INSERT INTO `tomcat_roles` (`role_name`) VALUES
('ADMIN'),
('VIS');
/*!40000 ALTER TABLE `tomcat_roles` ENABLE KEYS */;
--
-- Definition of table `tomcat_users`
--
DROP TABLE IF EXISTS `tomcat_users`;
CREATE TABLE `tomcat_users` (
`user_name` varchar(20) NOT NULL,
`password` varchar(32) NOT NULL,
PRIMARY KEY (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `tomcat_users`
--
/*!40000 ALTER TABLE `tomcat_users` DISABLE KEYS */;
INSERT INTO `tomcat_users` (`user_name`,`password`) VALUES
('kermit','thefrog'),
('sfigato','sfigato');
/*!40000 ALTER TABLE `tomcat_users` ENABLE KEYS */;
--
-- Definition of table `tomcat_users_roles`
--
DROP TABLE IF EXISTS `tomcat_users_roles`;
CREATE TABLE `tomcat_users_roles` (
`user_name` varchar(20) NOT NULL,
`role_name` varchar(20) NOT NULL,
PRIMARY KEY (`user_name`,`role_name`),
KEY `tomcat_users_roles_foreign_key_2` (`role_name`),
CONSTRAINT `tomcat_users_roles_foreign_key_1` FOREIGN KEY (`user_name`) REFERENCES `tomcat_users` (`user_name`),
CONSTRAINT `tomcat_users_roles_foreign_key_2` FOREIGN KEY (`role_name`) REFERENCES `tomcat_roles` (`role_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `tomcat_users_roles`
--
/*!40000 ALTER TABLE `tomcat_users_roles` DISABLE KEYS */;
INSERT INTO `tomcat_users_roles` (`user_name`,`role_name`) VALUES
('kermit','ADMIN'),
('sfigato','VIS');
Ora dobbiamo agganciare il tomcat al db per fare in modo che
cerchi in quel realm e non nel realm di default, che è quello costituito dal
file xml tomcat-users.xml, che si trova sotto la directory conf.
Quindi i passi da seguire sono 2:
- Inserire il mysql-connector-java-3.0.17-ga-bin.jar (connettore jdbc di Mysql) sotto la directory di tomcat [ROOT]/lib;
- Modificare il file [ROOT]/conf/server.xml.
Per il punto 2 occorre decommentare il Realm standard e
sostituirlo con il nuovo, in questo modo:
<!--
<Realm
className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
-->
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/tomcat_realm"
connectionName="root" connectionPassword="root"
userTable="tomcat_users" userNameCol="user_name" userCredCol="password"
userRoleTable="tomcat_users_roles"
roleNameCol="role_name" />
</Realm>
A questo punto deployando l’applicazione sotto la cartella
webapps di Tomcat e digitando l’indirizzo http://localhost:8080/ProfileWeb
Compare il pop up di autenticazione
E quindi, poiché l’utenza inserita è di amministratore, si
vedranno entrambi i link, viceversa con l’altra utenza se ne vedrà soltanto
uno.
Nessun commento:
Posta un commento