MokaByte 51 - Aprile 2001
Foto dell'autore non disponibile
di
Matteo Baccan
Lotus Domino e Java
VI parte: la personalizzazione degli accessi
Ora che è chiaro il modo col quale sono gestiti gli utenti, gli accessi e i ruoli, all’interno di Lotus Notes, vediamo com’è possibile, tramite dei normali agenti, fare esattamente le stesse operazioni che nella quinta puntata abbiamo eseguito manualmente.

Quello che ho voluto fare, nella precedente puntata, era mettere a fuoco il modo con il quale potessero essere creati nuovi utenti, modificata un’ACL ed assegnati dei ruoli.
Per dimostrare tutte queste operazioni ho però preferito spiegare i giusti passi da compiere seguendo i menu di Lotus Notes, e non scrivendo del codice Java.
Ovviamente questo tipo di approccio non permette nessun tipo di automatizzazione e rappresenta un modo molto statico di gestire gli utenti.
Vedremo in questa puntata com’è possibile effettuare le stesse identiche operazioni, tramite l’utilizzo di Java. Quello che utilizzeremo saranno le classi messe a disposizione da Lotus, le stesse utilizzate dall’ambiente di disegno e gestione.
Acquisire questa manualità si rivelerà molto importante durante la fase di creazione di applicazioni dinamiche, nelle quali è importante riuscire a gestire il più possibile lato Web e quindi in modo completamente automatico.
 
 
 

Un caso d’uso
Come abbiamo visto, gli utenti di un server Notes, sono contenuti all’interno di un database particolare chiamato names.nsf. Per tale ragione, la creazione di un nuovo utente, non è altro che l’aggiunta di un nuovo documento a names.nsf.
Per rendere maggiormente didattica tale aggiunta, ho voluto analizzare un reale caso d’uso che potrebbe capitare in qualsiasi applicazione Web.
Il problema che mi sono posto è stato quello di poter indicare, in una form HTML, un nome e una password e alla conferma aggiornare sia il database utenti che l’access control list del database stesso.
Per fare questo ho creato una form per l’inserimento dei parametri, la quale verrà controllata nella fase di submit da parte di un agente, che si occuperà di fare tutto il lavoro.



Mettiamoci al lavoro
A questo punto, una volta focalizzato il nostro obiettivo, non ci resta che aprire Lotus Domino Designer, o per chi ha la versione 4 il client Notes, e creare la maschera sulla quale andremo a lavorare. Il nome di tale maschera sarà nuovoutente. All’interno di tale oggetto andremo poi ad inserire due campi che utilizzeremo per la successiva elaborazione. Tali campi saranno: nome e password.
Per completare la maschera non ci serve altro che definire un Hotspot Button, tramite il quale ordinare l’operazione di submit, che abbiamo gia analizzato nel corso di una delle puntate precedenti. Tale operazione si può effettuare con l’utilizzo della seguente formula:

@Command([FileSave]);
@Command([FileCloseWindow])

Per poter poi gestire i dati salvati tramite un agente, dobbiamo indicare a Lotus Domino quale agente deve essere utilizzato, tramite la valorizzazione dell’elemento WebQuerySave del form corrente:

@Command([ToolsRunMacro]; "salvautente")

In questo caso è stato indicato che il nome dell’agente da utilizzare è salvautente.
Dopo aver salvato la maschera, se non vi sono stati errori, possiamo andare a sviluppare il codice dell’agente salvautente. Quello che dovremo fare, a grandi linee, è aprire l’address book, aggiungere l’utente, aprire l’access control list del database corrente ed aggiungere anche qui il nuovo utente.
 





Scriviamo l’agente di submit
Come tutti gli agenti, possiamo sfruttare l’impostazione che ci propone Lotus Domino Designer, andando ad aggiungere quello che ci interessa valorizzare.
Se provate a creare un nuovo agente, l’ambiente di disegno vi proporrà una struttura simile alla seguente:

import lotus.domino.*;
public class JavaAgent extends AgentBase {
   public void NotesMain() {
      try {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();
         // (Your code goes here) 
         System.out.println("ok");
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

Se siete un po’ ansiosi e volete subito verificare il corretto funzionamento di questa prima parte di codice, vi consiglio di aggiungere, come nell’esempio, la riga System.out.println(“ok”) e verificare, provando a salvare i valori nella form, che nella console del server appaia la scritta “ok”.
Se tutto dovesse andare nel modo corretto, siamo pronti per passare alla fase successiva.
 


Il codice Java
La prima cosa da fare è quella di andare ad aprire l’address book.
Per fare questo dobbiamo, prima di tutto, sapere dove si trova tale archivio. In questo caso siamo però abbastanza fortunati, dato che nella quasi totalità dei casi, lo troveremo semplicemente nella directory data di Notes.
Per aprirlo non utilizzeremo quindi percorsi particolari, ma basterà indicarne il nome. Per fare questo dovremo chiedere alla sessione corrente, che abbiamo appena valorizzato nella variabile session, l’apertura del database tramite il metodo getDatabase. Ecco di seguito la riga che ci permette di fare questo:

Database names = session.getDatabase( "", "names.nsf" );

Come potete notare, il metodo getDatabase, riceve due parametri. Il primo, che ho omesso di indicare, è il nome del server sul quale aprire il file. Non indicandolo verrà automaticamente utilizzato il server corrente. Questo particolare ci permette di capire che, se l’utente con quale viene salvato l’agente ha diritto di lettura e scrittura anche in un server diverso dal corrente, potremo effettuare le stesse operazioni anche su un server remoto.
Ora che siamo riusciti ad aprire l’address book, non ci resta che iniziare a prendere i valori che sono stati immessi da browser nella form, utilizzando il metodo getItemValueString applicato al documento corrente, fornito dal metodo getDocumentContext dell’oggetto agentContext:

Document doc = agentContext.getDocumentContext();
String cNome = doc.getItemValueString("Nome");
String cPwd = doc.getItemValueString("password");

Come potete notare, il procedimento è molto più lungo da spiegare che da sviluppare, in quanto il suo utilizzo si riduce ad una riga di codice.
Fino a qui non ci sono stati grossi problemi implementativi, dato che, quello che viene immesso lato browser è esattamente quello che viene inserito nel database.
Esiste però una particolarità di cui dobbiamo tener conto, rappresentata dal campo password.
Tale campo deve essere salvato in modo criptato nel documento persona, quindi non è possibile un suo utilizzo diretto.
 


Concettualmente l’operazione da fare è semplice: si tratta di applicare la formula @password al valore di cPwd. Il problema è che, nell’interfaccia Java di Notes, tale funzione non esiste. Non vi è modo di utilizzarla, se non con un piccolo trucco, che è quello di richiamare @password, tramite il metodo di valutazione delle formule, evaluate, che la classe Session ci mette a disposizione.
Ultima particolarità di questo passaggio è data dal fatto che, il ritorno del metodo evaluate non è un valore String, come sarebbe giusto in questo caso specifico, ma un Vector di elementi, sul quale dobbiamo applicare le giuste trasformazioni per avere i valori che ci interessano.
Nel caso della formula @password, tale Vector, ha un solo elemento di tipo String.
Per tale ragione siamo costretti a scrivere questo codice per trasformare il valore digitato in valore criptato:

cPwd = "@PASSWORD('" +cPwd +"')";
Vector v = session.evaluate( cPwd );
cPwd = (String)v.firstElement();

Ora che abbiamo tutti gli elementi che ci servono, non ci resta che creare un nuovo documento all’interno del database names, valorizzandone i giusti campi e salvando il tutto.
La creazione del documento è attuabile tramite il metodo createDocument della classe Database:

Document person = names.createDocument();

Per la creazione dei campi invece si può sfruttare un semplice concetto: se valorizziamo un campo che non esiste all’interno del documento che abbiamo appena creato, Notes provvederà a crearlo.
Questo vuol dire che, un semplice richiamo al metodo appendItemValue di un campo che non esiste, ci permetterà la sua creazione.
I campi da creare in questo nuovo documento sono pertanto i seguenti:

FullName = Il nome del nuovo utente inserito
LastName = contiene lo stesso valore di FullName
Form = impostato a “Person”
Type = impostato a “Person”
HTTPPassword = la password criptata

Questi campi sono fondamentali per fare in modo che il nuovo documento venga correttamente indicizzato dalle viste di ricerca utenti. Traducendo in codice queste assegnazioni otterremo così il seguente listato:

person.appendItemValue("Form", "Person");
person.appendItemValue("Type", "Person");
person.appendItemValue("Fullname", cNome);
person.appendItemValue("LastName", cNome);
person.appendItemValue("HTTPPassword", cPwd);

Una volta creato il documento in memoria, basterà forzarne un salvataggio per poter avere finalmente il dato disponibile:

person.save(true,false);

Se tutto è andato alla perfezione, tramite Domino Administrator, sarà possibile vedere che, all’interno della lista degli utenti è apparso anche il nome dell’utente che abbiamo appena inserito con la pagina HTML.
Un’ultima osservazione deve essere fatta sul numero di campi disponibili nel documento person.
Andando a confrontare i campi del documento appena creato, con quelli di uno similare già presenti nel database, noterete una discordanza fra il numero di campi disponibili.
Tale differenza non è grave, dato che la maschera di inserimento standard di Notes crea tutta una serie di parametri aggiuntivi opzionali.
Se dovesse però porsi l’esigenza di modificare qualche caratteristica dell’utente appena inserito, sarà sempre possibile modificare il documento con i normali meccanismi Notes.
 


Modifica dell’ACL di un database
Il primo passo per una corretta creazione di nuovi utenti lato WEB è stato fatto. A questo punto possiamo vedere come, allo stesso modo, possiamo modificare l’access control list, di un database.
In questo caso abbiamo a disposizione una serie di classi che, in maniera molto semplice, permettono la gestione di tale aspetto dei database Notes.
La classe principale è sicuramente ACL, che permette di avere una completa gestione della lista degli utenti abilitati verso un certo database.
Con tale classe è possibile avere l’elenco degli utenti, aggiungerne uno nuovo o semplicemente rimuoverlo dalla lista di quelli attivi.
Insieme a tale classe è presente anche la classe che gestisce le proprietà del singolo utente. Tale classe è ACLEntry, e sarà la classe che andremo ad utilizzare per modificare le caratteristiche dell’utente.
Vediamo ora come possiamo utilizzare tali classi per personalizzare il nostro database di test.
Sicuramente la prima cosa da fare è quella di chiedere alla classe agentContext qual è il database corrente. Quest’operazione si effettua con una semplice riga di codice:

Database db = agentContext.getCurrentDatabase();

Una volta che abbiamo valorizzato un oggetto Database con il giusto valore¸ tramite il metodo getACL(), potremo facilmente accedere ad un oggetto in grado di manipolare la lista degli utenti. A questo punto, tramite l’utilizzo del metodo createACLEntry, potremo creare un nuovo utente e con un successivo salvataggio potremo aggiungere tale utente all’ACL:

// Aggiornamento ACL
Database db = agentContext.getCurrentDatabase();
ACL acl = db.getACL();
ACLEntry addACL = acl.createACLEntry( “user”, ACL.LEVEL_MANAGER);
acl.save();

Per verificare se l’aggiunta è stata fatta nel modo corretto, possiamo controllare l’effetto della nostra modifica, sia dall’ambiente di disegno, passando dalle caratteristiche del database, e sia utilizzando l’oggetto acl, scorrendone i valori e presentandoli a video:

// Visualizzo l'ACL
ACLEntry acle = acl.getFirstEntry();
do {
   System.out.println(acle.getName());
} while ((acle = acl.getNextEntry(acle)) != null);

il raggiungimento del primo elemento null indicherà la fine della lista degli utenti.
 

Test di accesso
Ora che l’utente è stato creato ed aggiunto a quelli che possono gestire il database, non ci resta che controllare, tramite un browser, se è possibile accedere ai dati, identificandoci con l’utente e password appena inseriti.
Per forzare l’identificazione dovremo però impostare a No Access l’accesso di default sul database. In questo modo forzeremo Notes a chiedere l’autentificazione dell’utente.
Se tutto è stato scritto nel modo corretto accederete ai dati del database e a tutte le sue risorse.
 
 
 

Conclusioni
A questo punto dovreste essere completamente padroni del sistema di autentificazione utenti di Notes. In realtà esistono delle tecniche leggermente più sofisticate per gestire in modo più elegante e meno intrusivo gli utenti, ma il loro utilizzo non si discosta molto da questi concetti.
Sommando così tutte le tecniche apprese nelle prime puntate di questo corso si dovreste essere in grado di affrontare con tranquillità la creazione di applicazioni di medie dimensioni.
Ovviamente, per poter sfruttare al meglio Notes, la cosa migliore da fare, è quella di studiare in modo approfondito, tutti i metodi delle classi disponibili. Fortunatamente però l’help fornito da Lotus è molto completo e dettagliato, corredato da numerosi esempi esplicativi, di sicuro supporto per ogni programmatore Notes.
A questo punto il corso subisce una piccola pausa, per dare spazio a due puntate nelle quali andremo ad illustrare come realizzare un progetto Internet di presentazione di documenti.
In questo modo potremo mettere in pratica i concetti utilizzati su un caso reale, vedendo com’è possibile pianificare, dallo sviluppo al rilascio, una semplice applicazione, curando anche i problemi di sicurezza nei quali potremmo incorrere.
 





Bibliografia
[1] http://www.lotus.com sito Internet di riferimento per i prodotti Lotus
[2] http://www.notes.net sito ufficiale di Lotus Domino. Da questo sito è possibile scaricare tutti gli aggiornamenti di Domino, dalla versione 4.0 all’ultimissima versione disponibile.
[3] http://www.mokabyte.it, sito contenente tutte le puntate di questo corso.
[4] http://www.infomedia.it/artic/Baccan, sito contenente alcuni articoli di approfondimento degli argomenti trattati.

Matteo Baccan 
Matteo Baccan è uno specialista di progettazione e sviluppo in C++, Java e Lotus Notes. Attualmente si occupa dello studio di tecniche avanzate di programmazione in ambito Internet/Intranet tramite Lotus Notes e Java, presso Integra Italia. Si possono consultare alcune sue pubblicazioni presso http://www.infomedia.it/artic/Baccan. Può essere contattato tramite e-mail all'indirizzo baccan@infomedia.it

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