Beispiel: IBM WebSphere-spezifische User-Registry
Dieses Beispiel zeigt die von Hr. Dreher vorgestellte UserRegistry in einem konkreten
Beispiel.
Aufbau des Beispiels:
- Es gibt zwei Rollen in dieser Anwendung, "ADMINISTRATOR" und "STUDENT".
- Die Benutzer werden in zwei Datenbanktabellen "ADMINISTRATOREN" und "STUDENTEN"
abgelegt, die jeweils über die Spalten ID, NAME, LOGIN und PASSWORT verfügen.
- Die Tabelle "STUDENTEN" könnte durch eine EJB befüllt werden, hier wird sie durch direkten
SQL-Zugriff gelesen.
- Zum Test dient eine simple Webanwendung (also kein EJB-Projekt).
Hier gibt es das WebSphere-Projekt als Projektaustausch-Export zum Download : UserRegistryExport.zip
Zusätzlich wird die Datenbank mit den Tabellen für die Authentifizierung benötigt: Datenbank.zip
WICHTIG: Das Projekt muss in einem Verzeichnis "C:\temp\UserRegistry"
liegen. In diesem MUSS die Datenbank in einem Unterverzeichnis "Datenbank" liegen (ZIP-Dateien enthält die letzte Pfadkomponente, also
nach c:\temp\UserRegistry entpacken !). Ansonsten stimmten Pfade zur Datenbank nicht.
Außerdem müssen drei Klassenvariablen angelegt werden (hier ist die Anleitung).
Die Datenbank enthält einen Administrator-User "ICH" mit Passwort "123" (unter diesem User wird
auch der Server gestartet) und einen Studenten "STUD1" mit Passwort "STUD1".
Erstellung des Projekts
Es wird ein Unternehmensanwendungsprojekt namens "UserRegistry" mit einem Webmodul erstellt.
Erstellen der Datenbankdefinition
- In der J2EE-Hierarchie eine Datenbankdefinition im Unterordner "/UserRegistry/META-INF"
namens "dbknauf" zufügen (dies erzeugt die Datenbank noch nicht !):
- In der Datenbank eine Schemadefinition namens "dbknauf" hinzufügen (Rechtsklick auf
Datenbank -> "Neu" -> "Neue Schemadefinition").
- Zwei Tabellen STUDENTEN und ADMINISTRATOREN zufügen, jeweils mit den Spalten ID (Integer, Primary Key),
NAME (Varchar, 100 Zeichen), LOGIN und PASSWORT.
- Erstellen der Datenbank mittels "CView".
Wichtig: Zuerst auf "Directory" klicken, dann das Wurzelverzeichnis wählen, in dem die Datenbank
liegen soll (z.B. "C:\temp\UserRegistry"). Dann im Feld "Name" die Pfadangabe löschen und
den tatsächlichen Namen der Datenbank angeben (im Beispiel: "Datenbank"). Im Zielverzeichnis
wird ein neues Unterverzeichnis mit diesem Namen angelegt.
Ein User MUSS angelegt werden, denn mit diesem muss man sich am Server anmelden, sobald
die Sicherheit im Server aktiviert wurde.
- (CView muss vor diesem Schritt wieder geschlossen sein !). Rechtsklick auf die Datenbank,
"Auf Server exportieren..." wählen. Unter "zu exportierende Daten auswählen" alles wählen.
In Schritt 2 alles auf Defaults belassen. In Schritt 3 werden die Einstellungen wie im
Screenshot vorgenommen. Unter "Datenbankposition" wird die eben erstellte Datenbank gewählt.
User und Passwort können frei vergeben werden.
Erstellen der User-Registry-Klasse
Die drei JARs wssec.jar, sas.jar und idl.jar müssen bekannt gemacht werden, damit das Interface
"UserRegistry" bekannt wird. Idealerweise diese Dateien nicht direkt referenzieren, sondern als
Umgebungsvariablen. Dazu im Menü "Fenster" unter "Benutzervorgaben" -> "Java" -> "Benutzervorgaben"
drei neue Klassenpfadvariablen KNAUF_WSSEC, KNAUF_SAS und KNAUF_IDL zufügen. Sie verweise auf folgende Pfade:
KNAUF_WSSEC -> C:/Programme/IBM/WebSphere Studio/Application Developer/v5.1.2/runtimes/base_v51/lib/wssec.jar
KNAUF_SAS -> C:/Programme/IBM/WebSphere Studio/Application Developer/v5.1.2/runtimes/base_v51/lib/sas.jar
KNAUF_IDL -> C:/Programme/IBM/WebSphere Studio/Application Developer/v5.1.2/runtimes/base_v51/lib/idl.jar
Jetzt wechselt man in die Projekteigenschaften des Web-Projekts und fügt unter "Java-Erstellungspfad"
die drei Bibliotheken zu.
Jetzt kann die UserRegistry-Klasse implementiert werden.
Web-Anwendung
Siehe Doku von Hr. Dreher: Die beiden Rollen "administratorweb" und "studentweb" werden zugefügt.
Eine "Integritätsbestimmungen für Sicherheit" zufügen, die auf die URL "/*" angewendet wird
und auf die die beiden Rollen Zugriff haben sollen. Authentifizierungsmethode soll hier BASIC sein
(Web-Browser blendet selbst einen Login-Dialog ein).
Rollen:
Rollenberechtigungen:
Einstellen der Login-Methode:
Hier kann man ohne Probleme auf Form-Based Login umschalten. Als Login-Seite wählt man
"login.jsp", außerdem gibt man eine Fehlerseite bei falschem Login an.
Das Formular auf "login.jsp" muss ein festes Ziel und feste Feldnamen haben.
Siehe
http://www-306.ibm.com/software/webservers/appserv/doc/v40/aes/infocenter/was/050403.html.
Auf "index.jsp" ist für ein spezielles Logout-Formular enthalten.
Anwendungsimplementierungsdeskriptor
Hier werden die Rollen aus dem Webimplementierungsdeskriptor mit den Rollen der UserRegistry
verknüpft.
Auf dem Karteireiter "Sicherheit" klickt man auf den Button "Erfassen...". Die zwei in der
Webanwendung definierten Rollen sollten auftauchen.
Jede Rolle wird angewählt und rechts unter "WebSphereBindings" die Option "Benutzer/Gruppen"
gewählt (zu der Rolle gehören die explizit angegebenen Benutzer/Gruppen).
Unter "Gruppen" fügt man bei "administratorweb" die Rolle "administrator" zu
(wird beim Anwendungsstart mit einer gleichnamigen Rolle aus der User-Registry abgeglichen).
Für "studentweb" wird "student" zugewiesen.
Server-Konfiguration
Hierbei kann man sich komplett an die Anleitung von Hr. Dreher halten.
WICHTIG beim aktivieren der globalen Sicherheit: KEINE "JAVA2-Sicherheit" aktivieren
(Checkbox zurücksetzen, nachdem sie beim Aktivieren der Sicherheit automatisch gesetzt wird)
Für den Fall, dass man wegen eines Konfigurationsfehlers den Server nicht mehr starten kann,
kann man die Sicherheit in den Servereigenschaften wieder ausschalten.
In Erweiterung des Beispiels habe ich außer Datenbankurl und -driver auch Schema, User und Passwort
per Server konfigurierbar gemacht. Zu beachten ist, dass die Datenbankurl hier den absoluten Pfad
enthält, weil sie manuell erstellt wurde (scheinbar verwenden die EJBs einen JNDI-Eintrag, den
wir auf dieser Stufe der Anwendung noch nicht haben).
Hier nochmal die Werte zum Copy&Paste:
DBDRIVER: com.ibm.db2j.jdbc.DB2jDriver
DBURL: jdbc:db2j:C:\temp\UserRegistry\Datenbank
DBPASSWORT und DBUSER: knauf
DBSCHEMA: SCHEMAKNAUF
Anwendungsablauf
Die User-Authentifizierung erfolgt in diesen Schritten:
- Initialisierung: Der Server erhält aus dem Deployment-Deskriptor eine Liste von Rollen-/Gruppen-Namen
(im Beispiel "administratorweb" und "studentweb")
- Initialisierung: Zu diesen Gruppen-Namen werden die IDs gelesen (durch Aufruf von "getUniqueGroupId").
- Login eines Users: Durch Aufruf von "checkPassword" prüft der Server, ob Login und Passwort gültig sind.
- Login eines Users: "getUniqueUserId" liefert die User-ID zum Login.
- Login eines Users: Alle berechtigten Gruppen des Benutzers werden durch "getUniqueGroupIds" geholt.
- Login eines Users: Der Server vergleicht diese Liste von Gruppen-IDs mit der beim Start eingelesenen und
ermittelt daraus die Gruppen-/Rollen-Namen zu den Gruppen. Der User wird auf Anwendungs-Rollen gemappt.