MokaByte 49 - Febbraio 2001
Foto dell'autore non disponibile
di
Matteo Baccan
Lotus Domino e Java 
V Parte - Gli utenti
Dopo aver analizzato form e viste, che rappresentano gli oggetti principali con i quali si interagisce con un database Notes, vediamo ora di capire in dettaglio come funziona il sistema di sicurezza dei database, com’è possibile creare un nuovo utente, un nuovo gruppo e come utilizzare tale informazione all’interno di un database Notes

Come si è capito dalle prime puntate, questo corso di Lotus Notes è orientato soprattutto all’utilizzo del prodotto con Internet e Java. Per tale ragione non ho approfondito alcuni aspetti funzionali legati al client e non mi sono minimamente dilungato sia su LotusScript che sulle funzionalità della parte server.
In questo modo, focalizzando le spiegazioni sulle parti pratiche, ognuno di voi, dovrebbe essere in grado di creare dal nulla un database Notes e riempirlo di contenuti.
A questo punto occorre però rallentare leggermente le parti pratiche, e dilungarsi su qualcosa di più teorico, che è rappresentato dalla gestione utenti.
Non andremo infatti a scrivere molto codice relativo a come e dove posso gestire un utente, ma vedremo soprattutto cosa fare, con gli automatismi che Notes ci mette a disposizione.
Una volta compreso questo meccanismo potremo iniziare a scrivere del codice, prima però, è necessaria una visione più generale


Figura 1 Apertura del database names




Creiamo un utente
Lotus Notes permette la creazione di utenti e gruppi di utenti. Un utente non è altro che un documento presente in un database particolare, chiamato names.nsf.
In realtà esistono però vari modi con i quali possiamo fare quest'operazione. Il più semplice è sicuramente quello di aprire l’address book del server, names.nsf, ed inserire al suo interno un nuovo utente. È però possibile anche definire un address book specifico per il database che dobbiamo gestire, ma questa spiegazione implicherebbe la conoscenza della parte di amministrazione di Notes e rischierebbe di confondere leggermente le idee, portando fuori tema la puntata. Quindi, per non complicare troppo la spiegazione, mi limiterò ad utilizzare il metodo più semplice, che consiste nella gestione diretta dell’address book.
Tale soluzione, che può andar bene in molti casi, potrebbe non essere la migliore in ambienti enterprise, dove ogni applicazione ha una gestione a parte e dove capire quali utenti sono specifici di un database e quali di un altro potrebbe essere un problema, utilizzando un solo address book, così come potrebbe essere un problema creare un address book troppo grosso.
Vediamo ora com'è possibile creare degli utenti in questo database, in modo che ci supportino durante gli esempi.
 
 


Figura 2 Gli utenti del server

La prima cosa da fare, è quella di aprire il Domino Administrator e spostarsi nella pagina relativa a People & Groups. A questo punto dovrebbe apparire la lista degli utenti del server che si sta gestendo. Nel caso che il server sia stato appena installato è probabile che tale lista comprenda un solo nome.
Sopra la lista vi sono dei pulsanti, il primo di tutti è Add Person, che sicuramente è il più interessante, e permette di aggiungere un nuovo utente.
Quello che faremo ora è creare due utenti, sui quali sperimenteremo i vari permessi di accesso.
Tali utenti saranno NORMALE e PRIVILEGIATO. In entrambi i casi andremo semplicemente ad indicare i campi Last Name, User Name e InternetPassword con gli stessi valori. Sono infatti queste le informazioni minime per poter creare un utente e garantirne l’utilizzo all’interno di un database.


Figura 3 I nuovi utenti





Gestione degli utenti
Ora che abbiamo due utenti di test, possiamo iniziare ad usarli all’interno di un database. La prima cosa da fare è quella di aprire il database al quale vogliamo vincolare gli accessi ed andare a modificarne l’ACL, acronimo di Access Control List, che non è altro che la lista degli utenti che possono accedere a tale database.
Per fare questo occorre posizionarsi sul database, premere click destro e, dal menu contestuale, accedere alla voce Access Control. Se tutto è andato nel modo corretto dovreste trovarvi di fronte ad una maschera contenete una lista di voci, che rappresentano gli utenti o i server abilitati ad aprire tale database. Esiste però una voce di default, chiamata appunto “-Default-“. Tale voce, se non modificata, indica che, gli utenti che non si identificano all’ingresso nel database, hanno accesso di Designer. Per forzare così una validazione siamo costretti a modificare tale valore da Designer a No Access.
In questo modo, se proviamo a salvare e ad accedere al database tramite un browser, noteremo che ci verrà richiesta una Basic Autentification da parte del browser, tramite la classica maschera di richiesta di Login e Password.


Figura 4 L’ACL

Se non immettiamo nessun valore Notes si limiterà a non farci entrare, mostrando il classico errore 401, che indica che l’utente non è autorizzato a questa operazione.
Proviamo allora ad effettuare la prima modifica ad database, aggiungendo l’utente NORMALE all’ACL del database, ed attribuendogli il tipo Person e l’accesso come Designer.
Proviamo ora a salvare e a chiedere al browser un reload della pagina. Noteremo che, digitando NORMALE sia come utente che come password, sarà nuovamente possibile accedere ai documenti del database sul quale stiamo lavorando.
Ora però, a differenza di quello che accade normalmente, dall'interno del database o da un qualsiasi agente, sappiamo esattamente il nome dell’utente che lo sta utilizzando.
Esiste infatti una variabile CGI chiamata REMOTE_USER che possiamo interrogare per sapere chi si è identificato all’apertura del database.
Tanto per fare una prova, proviamo a scrivere il seguente agente:

import lotus.domino.*;
public class JavaAgent extends AgentBase {
 public void NotesMain() {
  try {
   Session session = getSession();
   AgentContext agentContext = session.getAgentContext();
   Document doc = agentContext.getDocumentContext();

   String cNome = doc.getItemValueString("REMOTE_USER");

   getAgentOutput().println( "Tu sei: " +cNome );

  } catch(Exception e) {
   e.printStackTrace();
  }
 }
}

Questo agente si limita ad accedere al documento corrente e ad interrogare la variabile CGI REMOTE_USER presentandola a video. Noteremo quindi, alla sua invocazione tramite URL:

http://127.0.0.1/iform.nsf/testCheckUser

che il browser risponderà con la seguente scritta:

Tu sei: NORMALE

che è il nome dell'utente col quale ci siamo identificati.
Se proviamo però a forzare l’ingresso con l’utente PRIVILEGIATO:

http://PRIVILEGIATO:PRIVILEGIATO@127.0.0.1/iform.nsf/testCheckUser

noteremo che  l’utente, dato che non è indicato all’interno dei nomi degli utenti abilitati all’ingresso in questo database, non verrà accettato dal server che, dopo averci chiesto, fino a 3 volte, il nome dell’utente, concluderà con un errore 401.
Se proviamo ora ad aggiungere tale utente, alla lista degli utenti che possono effettuare operazioni nel nostro ambiente di test, noteremo che anche l’utente PRIVILEGIATO potrà accedere al database.


Figura 5 Richiesta password



Come avrete notato, per forzare un determinato accesso a iform.nsf, ho utilizzato la sintassi estesa con la quale è possibile invocare un URL.
Attenzione però all’utilizzo di tale sintassi. Pur essendo un modo comune di identificazione da parte di un browser, verso un server, i browser utilizzano tale accesso in maniera diversa.
Ad esempio, se utilizziamo Netscape ed entriamo su un certo server identificandoci in un certo modo:

http://PRIVILEGIATO:PRIVILEGIATO@127.0.0.1/iform.nsf/testCheckUser

e poi proviamo una connessione con un utente differente

http://NORMALE:NORMALE@127.0.0.1/iform.nsf/testCheckUser

il browser non si accorge del cambio di identità, e continuerà ad identificarci verso il server come se fossimo l’utente PRIVILEGIATO. Almeno questo accade dalla versione 4.05, all’ultima versione 4.x.


Figura 6 Errore di login
 
 


Figura 7 Controllo utente






Se invece utilizziamo un normale Internet Explorer l’utente viene correttamente modificato all’esecuzione del secondo utente. Per tale ragione consiglio l’utilizzo di Explorer, nel caso che si debbano fare numerosi tentativi con cambio di utente.
È comunque possibile continuare ad utilizzare Netscape, basta avere l’accortezza di usare una versione meno recente, oppure di uscire e rientrare dal programma in caso di cambio utente.
Finita questa doverosa puntualizzazione, che normalmente crea un notevole imbarazzo in fase di sviluppo di un sito sottoposto a identificazione, ed o ora che sappiamo come identificare una determinata persona all'interno di un database, vediamo come è possibile eseguire una serie di operazione in modo condizionato.


Figura 8 Errore sul server






Form dinamiche
La prima modifica che andremo a fare è il classico condizionamento di visualizzazione.
Prendiamo ora una qualsiasi form e proviamo a condizionare il titolo in base all’utente. Andrò ad usare, per coloro che seguono il corso dalla prima puntata, la form di nome submit, che era un semplice esempio di uso dell’opzione submit.
Andiamo a modificare la prima riga, che riporta la scritta “esempio di uso di submit”, aggiungendo anche “per utente normale”. A questo punto, per poter sperimentare il cambio di utente, andiamo a copiare tale riga sulla seconda riga della form, andando ad indicare “per utente privilegiato” al posto di normale.


Figura 9 Preparazione paragrafo



Non ci resta ora che condizionare tali due righe con una semplice formula.
Se, tramite il click destro del mouse, attiviamo la form di modifica dei parametri del testo, possiamo indicare la formula con la quale condizionare la visualizzazione.
Notes infatti ci permette di indicare una condizione per la quale un certo paragrafo, nel nostro caso la riga, non deve essere visualizzato. Dato che esiste una funzione in grado di restituire il nome dell'utente corrente, andremo ad inserire la seguente espressione che ci permette di nascondere il dato all’utente NORMALE:

@UserName="NORMALE"

allo stesso modo potremmo fare per l’utente privilegiato:

@UserName="PRIVILEGIATO"

Se proviamo ora le due diverse visualizzazioni, noteremo come, l’aspetto della form muterà di conseguenza:

http://PRIVILEGIATO:PRIVILEGIATO@127.0.0.1/iform.nsf/submit
http://NORMALE:NORMALE@127.0.0.1/iform.nsf/submit

La comprensione di questo aspetto è fondamentale, in quanto, con questa semplice tecnica è possibile adattare completamente il layout di una form ad un certo utente.
 



Figura 10 Uso di submit per NORMALE





I ruoli
Giustamente chi gestisce un database Notes potrebbe non voler legare il disegno di una form ad un certo utente, ma magari ad un gruppo di utenti perché probabilmente, non è possibile sapere, all’atto della costruzione delle maschere, quali sono gli utenti che possono fare un qualcosa, ma neppure quali sono esattamente i gruppi che si verranno a creare.
In fase di progettazione, normalmente, si conoscono solo quali sono le funzionalità che deve avere un database, senza sapere chi e come le andrà a sfruttare.
Per tale ragione sono stati inventati i ruoli.
Se provate ad aprire la maschera contenente la lista degli utenti che possono usare il database noterete che, sulla parte sinistra, esiste una piccola icona che riporta la frase: “roles”.
I ruoli non sono altro che delle etichette che si possono creare in maniera completamente autonoma ed associare ad un determinato gruppo o ad un determinato utente.
Ipotizziamo che all’interno del database ci siano tre aree: A, B e C. In tali aree devono accedere solamente degli utenti autorizzati.
 
 


Figura 11 Assegnazione ruoli



A questo punto ipotizziamo che ci siano due utenti o due gruppi con caratteristiche differenti. Il primo gruppo può accedere solamente all’area A, mentre il secondo all'area A e B, ma non a C.
Come possiamo risolvere tale problema? Condizionando le maschere in base all'utente? Sicuramente no, perché se ci fosse un altro utente da inserire, che magari non deve vedere l’area A e B, ma solo C, sarebbe dispendioso andare a modificare l’intero archivio per gestire quest’eccezione.
Per tale ragione, l’approccio migliore che possiamo avere è quello di definire dei ruoli.
Nel nostro caso creeremo tre ruoli chiamati appunto A, B e C. Una volta confermata l’informazione, se proviamo a posizionarci nella lista dei nomi presenti in ACL, noteremo che, in basso a destra, la finestrella con indicati i roles andrà a visualizzare i tre valori appena inseriti.
Proviamo ora ad selezionare i ruoli A, per l’utente NORMALE e A e B per l’utente PRIVILEGIATO.
A questo punto rientriamo nella form che avevamo precedentemente configurato per visualizzare delle informazioni diverse in base all’utente, e proviamo ad inserire tre nuove righe per verificare l’avvenuta gestione dei ruoli.
In queste righe andremo a verificare singolarmente se i tre ruoli sono stati gestiti nella maniera corretta, inserendo le seguenti condizioni di non visualizzazione:

!@IsMember("[A]"; @UserRoles)
!@IsMember("[B]"; @UserRoles)
!@IsMember("[C]"; @UserRoles)

ovviamente useremo la prima condizione per la prima riga, la seconda per la seconda e così via.
Quello che noteremo ora, entrando nelle maschere, è che, le righe condizionate in base ai ruoli, varieranno la loro visualizzazione in base all’utente, non in base al nome, ma in base al parametro ulteriore che abbiamo indicato. Questa particolarità ci permette quindi di lavorare su un livello di astrazione maggiore non sul singolo utente, ma su delle funzionalità che debbono o meno essere attivate.


Figura 12 Gestione ruoli



Conclusioni
Come abbiamo visto, in modo molto semplice ed intuitivo, è possibile applicare una gestione utenti, ad un qualsiasi database Notes. Dal punto di vista della sicurezza si può però obiettare che, una basic autentification, non è sicuramente un modo sicuro di proteggere dei dati in rete, ma se pensiamo questo approccio, all'interno di una connessione SSL, noteremo subito che la tecnica diventa estremamente sicura.
Nella prossima puntata andremo in maggior dettaglio sulla gestione utenti, vedendo come, da codice, possiamo fare tutte le operazioni che qui abbiamo fatto manualmente.
 

Vai alla Home Page di MokaByte
Vai alla prima pagina di questo mese


MokaByte®  è un marchio registrato da MokaByte s.r.l.
Java®, Jini®  e tutti i nomi derivati sono marchi registrati da Sun Microsystems; tutti i diritti riservati
E' vietata la riproduzione anche parziale
Per comunicazioni inviare una mail a
mokainfo@mokabyte.it