Introduzione
2
1.1.2. Vincoli
I suddetti obiettivi vogliono essere perseguiti tenendo in debita considerazione alcuni
vincoli:
ξ uso di strumenti standard: l’utilizzo di tecnologie standard e diffuse semplifica il
lavoro dello sviluppatore, sia in fase di progetto che in caso di successive
modifiche; inoltre agevola l’integrazione con altre applicazioni;
ξ riusabilità: realizzando un sistema facilmente adattabile a casi applicativi diversi, si
fornisce al lavoro un notevole valore aggiunto;
ξ accessibilità: si vuole realizzare un’applicazione server che sia utilizzabile con
semplicità da una gamma di utenti la più ampia possibile, che cioè non richieda dal
lato client la disponibilità di strumenti poco diffusi;
ξ performance: quanto detto vuole essere realizzato contenendo le risorse utilizzate,
sia in termini di banda di trasmissione che di tempo di elaborazione.
Introduzione
3
1.2. La soluzione proposta
1.2.1. L’architettura del sistema
L’architettura del sistema è rappresentata in figura 1.1 ed è di tipo multi-tier, ossia può
essere realizzata inserendo un middle-tier, o strato intermedio, che consenta di accedere
alla base di dati, autenticando l’utente, verificandone i diritti di accesso e gestendo poi la
comunicazione vera e propria. Tale componente non deve necessariamente trovarsi sulla
stessa macchina del database, ma, in generale, può essere situato su un qualunque
computer della rete.
Lo strato intermedio è stato quindi suddiviso in due parti: una per gestire l’autenticazione
dell’utente, l’altra per accedere alla base di dati, estrarne le informazioni ed inviarle
all’utente. La prima parte quindi rappresenta il client della seconda.
Questa tesi si concentra nella realizzazione della seconda parte, sviluppata
implementando un Web Service, che mette a disposizione gli strumenti per accedere alla
base di dati in modo sicuro, estrarne le informazioni richieste dall’utente e conservare la
segretezza dei dati mediante cifratura.
Figura 1.1 - L’architettura multi-tier del sistema
Utente finale
Authentication
Server
DBXML4U
Server
middle-tier
Base di dati
Introduzione
4
L’applicazione client si occupa dell’interfaccia con l’utente finale e della sua
autenticazione, per cui tra gli obiettivi secondari di questa tesi si considera anche
l’integrazione con componenti preesistenti, finalizzata ad una riduzione dei costi di
mantenimento.
L’applicazione client è stata sviluppata in un lavoro parallelo, ma è bene precisare che
non deve essere obbligatoriamente questa: la nostra applicazione è stata creata per
essere utilizzata da una qualunque altra applicazione che voglia permettere agli utenti di
accedere alle informazioni contenute in una base di dati, offrendo la massima riusabilità.
Inoltre è stato sviluppato uno strato di accesso multilivello alla base di dati, che consiste
nella realizzazione di una seconda base di dati per la gestione dei diritti degli utenti,
permettendo la creazione di diversi profili, corrispondenti a differenti diritti di accesso al
sistema.
1.2.2. La scelta degli strumenti
Come anticipato, nella scelta degli strumenti per l’implementazione del sistema si è
cercato di utilizzare tecnologie il più possibile standard.
Le basi di dati sono state create mediante MySQL, un solido, sofisticato, potente, veloce e
robusto DBMS relazionale, fornito di una documentazione completa e continuamente
aggiornata. MySQL è un database relazionale client/server e multi threaded, il che
significa che può gestire richieste multiple degli utenti, tenendole indipendenti le une dalle
altre, sfruttando le capacità del sistema operativo.
Per far comunicare tra loro i vari livelli dell’architettura si è scelto di utilizzare SOAP
(Simple Object Access Protocol), un semplice e leggero protocollo applicativo che
fornisce un metodo consistente e strutturato di trasporto dei dati e di chiamata di
procedure fra applicazioni distribuite. SOAP inoltre basa il suo funzionamento su
tecnologie preesistenti e ben collaudate, senza introdurne di nuove: in particolare viene
sfruttato HTTP (HyperText Markup Language) per il trasporto dei dati e XML (eXtensible
Markup Language) per la loro serializzazione, permettendo così di transitare attraverso i
firewall aziendali. Lo standard SOAP è poi indipendente dalla piattaforma e, in realtà,
anche dal protocollo di trasporto: infatti è teoricamente possibile effettuare la richiesta e
ricevere la risposta utilizzando qualsiasi protocollo che supporti informazioni testuali.
Introduzione
5
Si desidera anche una certa esportabilità dei dati estratti dalla base di dati, in modo che
qualsiasi sistema possa utilizzare tali dati. Per questo è stato scelto il linguaggio XML,
grazie ai suoi indubbi punti di forza: XML si basa su testo ASCII, un formato diffuso da
moltissimi anni in ogni settore; XML è compatto, perché si limita ad essere un contenitore
di dati, senza le aggiunte legate all’elaborazione tipiche dei formati dei database
proprietari.
XML è quindi stato sfruttato direttamente per la codifica dei risultati delle query: quello che
la nostra applicazione fornisce in risposta è, infatti, un documento XML, corredato da un
foglio di stile XSL per l’eventuale formattazione dei dati.
Quanto al linguaggio implementativo, la scelta di Java appare, per svariati motivi, quasi
obbligata: Java, infatti, nasce proprio per fornire uno strumento di programmazione
esportabile, ad esempio tramite Internet, e tale da permettere l’esecuzione di
un’applicazione su qualsiasi sistema dotato semplicemente di una Java Virtual Machine.
Per poter lavorare con le base di dati è stato usato JDBC, un’API che consente al
programmatore di inviare query ad una base di dati relazionale, di effettuare delete o
update dei dati all’interno di tabelle, o di ottenere meta-informazioni relativamente alle
basi di dati. JDBC è molto flessibile, anche grazie al fatto che è stato progettato
basandosi sul concetto di interfaccia e non di oggetto: tutte le operazioni necessarie per
accedere ai dati vengono fatte attraverso i metodi esposti da interfacce e non occorre
istanziare alcun oggetto. È importante sottolineare che JDBC è un’interfaccia a oggetti per
l’esecuzione di comandi SQL e quindi il vero medium per la comunicazione con la base di
dati rimane il linguaggio SQL.
Java inoltre fornisce uno strumento molto utile per la realizzazione di documenti XML:
l’API JDOM, ossia uno strumento simile al DOM ma più semplice e potente, indirizzata
proprio alla manipolazione di documenti XML.
La scelta di Java come linguaggio di programmazione indirizza infine la scelta degli
strumenti crittografici verso la JCE (Java Cryptography Extension), API presente
nell’ambiente run-time standard di Java, che fornisce un supporto collaudato ed affidabile
alle più importanti funzioni di sicurezza.
Introduzione
6
1.3. I capitoli della tesi
La tesi è suddivisa in diversi capitoli, atti all’illustrazione delle metodologie di sviluppo
utilizzate ed alla descrizione dell’architettura di sistema realizzata, fino ai dettagli
dell’implementazione software del lavoro.
Capitolo 2. Basi di dati: teoria delle basi di dati e loro utilizzo mediante Java;
Capitolo 3. Accesso multilivello alle basi di dati: dettagli del sistema di accesso
multilivello per la gestione dei diritti degli utenti;
Capitolo 4. Sicurezza e crittografia: panoramica sui concetti di sicurezza e sugli
algoritmi crittografici e loro implementazione con strumenti Java;
Capitolo 5. XML e XSL: esposizione dei fondamenti dei due linguaggi, esempi ed
applicazioni tramite Java;
Capitolo 6. SOAP: descrizione del protocollo e suo utilizzo;
Capitolo 7. Architettura del sistema: dettagli implementativi dell’architettura di
sistema, simulazione e risultati;
Capitolo 8. Il software: panoramica sulle classi Java sviluppate, descrizione ed
installazione del software;
Appendice. Documentazione del software: documentazione Javadoc in inglese;
Bibliografia.
Basi di dati
7
2. Basi di dati
2.1. Le basi di dati
Ogni giorno nel mondo vengono scambiati volumi di dati molto elevati e quasi in ogni
parte della terra le informazioni vengono prelevate, elaborate, trasformate, accresciute,
aggiornate e infine ricostruite. Le basi di dati sono il centro vitale di questo movimento:
permettono non solo di archiviare i dati e le informazioni raccolte nei vari campi dell’attività
economica, scientifica, tecnologica, ma garantiscono anche la sicurezza e l’integrità dei
dati medesimi, così come la possibilità di poterli recuperare in ogni momento nel modo più
efficiente e rapido possibile.
A mano a mano che l’informatica ha conquistato un ruolo fondamentale nei vari campi
dell’attività umana, è emersa la necessità di avere dei sistemi capaci di gestire in modo
avanzato i dati e le informazioni. I DataBase Management System (DBMS) sono la
risposta più significativa a questa esigenza. Per DBMS si intende un sistema costituito
essenzialmente dalla base di dati vera e propria e, soprattutto, dal software per gestire
tutte le operazioni che ordinariamente si fanno su una base di dati, dall’archiviazione
all’aggiornamento, fino al backup e al mirroring.
Risale agli inizi degli anni Ottanta la comparsa sul mercato software dei primi DBMS.
Pioniere nel campo della ricerca orientata alle basi di dati è stata la IBM che, prima
ancora di altri grandi database vendor come Oracle e Informix, si trovò ad affrontare la
necessità di fornire sui propri sistemi mainframe, allora già largamente diffusi, del software
capace di gestire efficacemente l’archiviazione dei dati. In origine tali sistemi usavano il
file system del sistema operativo che li ospitava come unità di immagazzinamento per le
basi di dati. Così la ricerca si orientò allo studio di un metodo di organizzazione e
strutturazione dello spazio nei file per un’archiviazione ottimale ed un accesso efficiente ai
dati. Il concetto di tabella divenne popolare agli inizi degli anni Settanta grazie a E. Codd,
un ricercatore di IBM, che gettò le basi di un approccio teorico ancora oggi largamente
utilizzato in questo settore. Con la comparsa di nuovi protagonisti nel campo della ricerca
e dello sviluppo delle basi di dati, sorse l’esigenza di avere un linguaggio comune per
l’accesso ai dati, in quanto ognuno di loro disponeva di uno standard proprietario. Anche
Basi di dati
8
in questo la IBM fu la protagonista principale, ed infatti finì per diffondersi un suo
linguaggio chiamato SQL (Structured Query Language) oggi molto popolare: da allora non
ha subito modifiche ma solo aggiunte.
Un DBMS è sostanzialmente uno strato software che si frappone fra l’utente ed i dati veri
e propri. Grazie a questo strato intermedio l’utente e le applicazioni non accedono ai dati
così come sono memorizzati effettivamente, cioè alla loro rappresentazione fisica, ma ne
vedono solamente una rappresentazione logica. Ciò permette un elevato grado di
indipendenza fra le applicazioni e la memorizzazione fisica dei dati.
Un DBMS si articola su tre livelli di astrazione, detti rispettivamente esterno, logico e
interno:
ξ Livello esterno: costituisce la descrizione di una porzione della base di dati, che si
ottiene servendosi delle procedure specializzate per i diversi utenti (ad esempio la
creazione temporanea di tabelle attraverso delle interrogazioni alla base di dati).
Gli accessi ad una base di dati da parte degli utenti possono avvenire solo
attraverso tale livello.
ξ Livello logico: costituisce la descrizione dell’intera base di dati per mezzo della
rappresentazione logica dei dati adottata dal DBMS, prescindendo dalla struttura
fisica degli archivi.
ξ Livello interno: costituisce la rappresentazione della struttura della base di dati in
termini delle strutture fisiche di memorizzazione (il tipo di file utilizzato per salvare
la base di dati).
L’architettura del DBMS così definita assicura l’indipendenza dei dati, che è la principale
proprietà del DBMS: questa proprietà garantisce che gli utenti ed i programmi applicativi
che utilizzano una base di dati possano interagire ad un elevato livello di astrazione, che
prescinde dai dettagli realizzativi utilizzati nella costruzione della base di dati. Tale
indipendenza si attua attraverso due livelli:
ξ Indipendenza fisica: consente di interagire con il DBMS in modo indipendente
dalla struttura fisica dei dati.
ξ Indipendenza logica: consente di interagire con il livello esterno della base di dati
in modo indipendente dal livello logico.
Basi di dati
9
Le funzionalità principali che devono caratterizzare un DBMS sono quelle di:
ξ consentire l’accesso ai dati attraverso il livello esterno, invece che attraverso il
livello interno;
ξ permettere la condivisione e l’integrazione dei dati fra applicazioni differenti;
ξ controllare l’accesso concorrente ai dati;
ξ assicurare la sicurezza e l’integrità dei dati.
Grazie a questi aspetti le applicazioni che vengono sviluppate possono contare su una
sorgente dati sicura, affidabile e generalmente scalabile. Tali proprietà sono auspicabili
per applicazioni che usano la rete Internet come infrastruttura e che hanno quindi evidenti
problemi di sicurezza e scalabilità.
Come qualsiasi software, anche una base di dati viene manipolata attraverso dei
linguaggi specifici per basi di dati. Questi linguaggi si dividono in due categorie:
ξ Data Definition Language (DDL): utilizzati per definire gli schemi logici, esterni e
fisici.
ξ Data Manipulation Language (DML): impiegati per le interrogazioni e
l’aggiornamento delle istanze di basi di dati.
Il linguaggio che è comunque maggiormente utilizzato per le basi di dati è l’SQL, che può
essere usato sia come DDL sia come DML.
La caratteristica principale secondo cui i DBMS vengono normalmente classificati è la
rappresentazione logica dei dati che essi mostrano ai loro utilizzatori. Nel corso degli anni
sono stati adottati numerosi modelli per l’espressione di tali dati, a fronte dei quali
esistono quindi vari tipi di basi di dati. I tipi più comuni sono:
ξ Basi di dati gerarchiche: i dati vengono organizzati in insiemi legati fra loro da
relazioni di "possesso", in cui un insieme di dati può possedere altri insiemi di dati,
ma un insieme può appartenere solo ad un altro insieme. La struttura risultante è
un albero di insiemi di dati.
ξ Basi di dati reticolari: il modello reticolare è molto simile a quello gerarchico, ed
infatti nasce come estensione di quest’ultimo. Anche in questo modello insiemi di
dati sono legati da relazioni di possesso, ma ogni insieme di dati può appartenere
a uno o più insiemi. La struttura risultante è una rete di insiemi di dati.
Basi di dati
10
ξ Basi di dati relazionali: le basi di dati appartenenti a questa categoria si basano sul
modello relazionale, la cui struttura principale è la relazione, ossia una tabella
bidimensionale composta da righe e colonne. Ciascuna riga, che in terminologia
relazionale viene chiamata tupla, rappresenta un’entità che si vuole memorizzare
nella base di dati. Le caratteristiche di ciascuna entità sono definite invece dalle
colonne delle relazioni, che vengono chiamate attributi. Entità con caratteristiche
comuni, cioè descritte dallo stesso insieme di attributi, faranno parte della stessa
relazione.
ξ Basi di dati ad oggetti (object-oriented): lo schema di una base di dati ad oggetti è
rappresentato da un insieme di classi, che definiscono le caratteristiche ed il
comportamento degli oggetti che popoleranno la base di dati. La principale
differenza con i modelli esaminati finora è la non passività dei dati: con una base
di dati object-oriented, infatti, gli oggetti memorizzati nella base di dati contengono
sia i dati che le operazioni possibili su di essi e non è quindi necessario
demandare tali operazioni alle applicazioni che li utilizzano.
I primi due tipi di basi di dati, quelli gerarchici e reticolari, quasi appartengono ormai alla
storia dell’informatica. La maggior parte delle basi di dati attualmente utilizzate appartiene
alla categoria delle basi di dati relazionali. I motivi di questo successo (anche
commerciale) vanno ricercati nella rigorosità matematica e nella potenzialità espressiva
del modello relazionale su cui si basano, nella sua semplicità di utilizzo e, ultima ma non
meno importante, nella disponibilità di un linguaggio di interrogazione standard, l’SQL,
che, almeno potenzialmente, permette di sviluppare applicazioni indipendenti dal
particolare DBMS relazionale utilizzato.
Basi di dati
11
2.2. Il modello relazionale
Le basi di dati relazionali sono il tipo di basi di dati attualmente più diffuso. I motivi di
questo successo sono fondamentalmente due:
1. forniscono sistemi semplici ed efficienti per rappresentare e manipolare i dati;
2. si basano su un modello, quello relazionale, con solide basi teoriche.
Il modello relazionale è stato proposto originariamente da Codd in un famoso articolo del
1970. Grazie alla sua coerenza ed usabilità, il modello è diventato negli anni Ottanta
quello più utilizzato per la produzione di DBMS.
La struttura fondamentale del modello relazionale dei dati è appunto la relazione, che
consente di organizzare i dati in insiemi di record a struttura fissa. Una relazione viene
spesso rappresentata per mezzo di una tabella, le cui righe sono specifici record e le cui
colonne corrispondono agli attributi dei record: l’ordine delle righe e delle colonne è
sostanzialmente irrilevante.
Una sola relazione può anche essere una base di dati, ma il più delle volte una base di
dati è formata da molte relazioni che correlano tra di loro i propri dati in maniera da fornire
un’informazione esaustiva.
Ad esempio consideriamo due relazioni quali DOCENZA e MANIFESTO. Il nostro
obiettivo è di rappresentare i dati relativi ai corsi universitari e ai loro docenti ed
all’inserimento dei corsi nel manifesto degli studi. Quello che otteniamo è:
DOCENZA
Corso NomeDocente
Basi di Dati Rossi
Elettronica Bianchi
Telematica Verdi
MANIFESTO
Corso Anno
Basi di Dati 4
Elettronica 3
Telematica 5
Nel momento in cui ci occupiamo di utilizzare il modello relazionale, dobbiamo innanzitutto
dichiararlo preventivamente e quindi impostarlo in maniera corretta. Ci vengono in questo
caso in aiuto due elementi: schema ed istanza.
Basi di dati
12
Lo schema di una relazione (sostanzialmente invariato nel tempo) è costituito da una sua
intestazione, vale a dire dal nome della relazione seguito dai nomi dei suoi attributi. Se ad
esempio consideriamo la tabella DOCENZA (da notare come ora tabella e relazione
diventino sinonimi) il suo schema sarà:
DOCENZA (Corso, NomeDocente)
Viceversa le righe della tabella DOCENZA variano nel tempo e corrispondono ai corsi
attualmente offerti e ai relativi docenti. Di conseguenza l’istanza di una relazione è
costituita dall’insieme, variante nel tempo, delle sue righe:
Basi di Dati Rossi
Elettronica Neri
Telematica Verdi
Se la base di dati fosse composta dalle sole due relazioni DOCENZA e MANIFESTO
allora lo schema della base di dati sarebbe:
DOCENZA (Corso, NomeDocente)
MANIFESTO (Corso, Anno)
e la relativa istanza della base di dati sarebbero state tutte le righe di entrambe le tabelle.
Uno dei grandi vantaggi del modello relazionale è che esso definisce anche un’algebra,
chiamata appunto algebra relazionale. Tutte le manipolazioni possibili sulle relazioni sono
ottenibili grazie alla combinazione di cinque soli operatori: RESTRICT, PROJECT, TIME,
UNION e MINUS. Sono stati anche definiti tre operatori addizionali, che comunque
possono essere ottenuti applicando i soli cinque operatori fondamentali: JOIN,
INTERSECT e DIVIDE. Gli operatori relazionali ricevono come argomento una relazione o
un insieme di relazioni e restituiscono una singola relazione come risultato.
Vediamo brevemente questi otto operatori:
RESTRICT: restituisce una relazione contenente un sottoinsieme delle tuple della
relazione a cui viene applicato. Gli attributi rimangono gli stessi.
PROJECT: restituisce una relazione con un sottoinsieme degli attributi della relazione a
cui viene applicato.
TIME: viene applicato a due relazioni ed effettua il prodotto cartesiano delle tuple. Ogni
tupla della prima relazione viene concatenata con ogni tupla della seconda.
Basi di dati
13
UNION: applicando questo operatore a due relazioni compatibili, se ne ottiene una
contenente le tuple di entrambe le relazioni. Due relazioni sono compatibili se hanno lo
stesso numero di attributi e gli attributi corrispondenti nelle due relazioni hanno lo stesso
dominio.
MINUS: applicato a due relazioni compatibili, ne restituisce una terza contenente le tuple
che si trovano solo nella prima relazione.
JOIN: vengono concatenate le tuple di due relazioni in base al valore di un insieme dei
loro attributi.
INTERSECT: applicato a due relazioni compatibili, restituisce una relazione contenente le
tuple che esistono in entrambe le relazioni.
DIVIDE: applicato a due relazioni che abbiano degli attributi comuni, ne restituisce una
terza contenente tutte le tuple della prima relazione che possono essere fatte
corrispondere a tutti i valori della seconda relazione.
Le basi di dati relazionali compiono tutte le operazioni sulle tabelle utilizzando l’algebra
relazionale, anche se normalmente non permettono all’utente di utilizzarla. L’utente
interagisce con la base di dati attraverso un’interfaccia differente, il linguaggio SQL, un
linguaggio dichiarativo che permette di descrivere insiemi di dati. Le istruzioni SQL
vengono quindi scomposte dal DBMS in una serie di operazioni relazionali.