giovedì 6 ottobre 2011

Sistema profilatura utente con Java Tomcat e MySql


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');

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