Eine Webanwendung zur Verwaltung von Benutzern eines Tomcat Web- und Applikationsservers in einer Derby-Datenbank.
Die Nutzerverwaltung stellt die folgenden Funktionen bereit
Die Bedienoberfläche passt sich an verschiedene Geräteausstattungen an (responsiv). Sie fügt sich neben den o.a. Funktionen in den Rahmen für Verwaltungsfunktionen einer WebBox ein, kann aber ebensogut als einzelne Webanwendung auf Tomcat für die Nutzerverwaltung sorgen.
Weitere Informationen zur Nutzerverwaltung finden sich auf der Produktseite
Zum Herstellen der Webanwendung wird ein Java Development Kit (JDK) benötigt, wie es z.B. von Azul oder dem OpenJDK-Projekt erhältlich ist. In der hier folgenden weiteren Beschreibung wird der lokale Ablageort des Java Development Kits $JDK
genannt. Desweiteren werden die folgenden Klassenbibliotheken benötigt
Bibliothek Datei(en) Ablageort lokal
---------- --------- ---------------
Tomcat .... lib/servlet-api.jar .. $CATALINA_HOME
XStream ... xstream-1.4.7.jar .... $JLIB
Jettison .. jettison-1.3.3.jar ... $JLIB
BaseLink .. BaseLink.jar ......... $JLIB
Transit ... Transit.jar .......... $JLIB
Diese sind an folgenden Orten frei erhältlich:
Nach Beschaffung des JDK und der oben angegebenen Klassenbibliotheken wird der Quellcode aus diesem Git-Repository an einen frei wählbaren lokalen Ablageort heruntergeladen und entpackt. In der hier folgenden weiteren Beschreibung wird das so entstandene Verzeichnis um-master
einschließlich des absoluten Pfades dorthin $UM
genannt. Ferner wird angenommen, dass die oben aufgeführten Klassenbibliotheken lokal an Orten abgelegt sind, deren Pfade mit den Platzhaltern $JLIB
und $CATALINA_HOME
gemeint sind. Anstelle der Platzhalter in den folgenden Kommandos muss also der absolute Pfad des lokalen Ablageortes eingesetzt werden.
Zur Herstellung der Nutzerverwaltung werden die folgenden Kommandos ausgeführt (Beispiel für Linux):
cd $UM
mkdir dist build
cp -r web/* build
cd build/WEB-INF
mkdir classes lib
cd ../..
cp $JLIB/* build/WEB-INF/lib
$JDK/bin/javac -classpath $JLIB/jettison-1.3.3.jar:$JLIB/BaseLink.jar:$JLIB/Transit.jar:$JLIB/xstream-1.4.7.jar:$CATALINA_HOME/lib/servlet-api.jar -d ./build/WEB-INF/classes src/java/de/uhilger/um/*.java src/java/de/uhilger/um/api/*.java src/java/de/uhilger/um/web/*.java src/java/de/uhilger/um/daten/*.java
$JDK/bin/jar -cf dist/um.war -C build .
rm -r build
Das Webarchiv der Nutzerverwaltung liegt anschließend als $UM/dist/um.war
fertig zum Deployment bereit.
Das Kommando cp $JLIB/* build/WEB-INF/lib
kann auch weggelassen werden, dann sind die Klassenbibliotheken nicht Teil des Webarchivs der Nutzerverwaltung. In diesem Fall muss stattdessen der Inhalt von $JLIB
nach $CATALINA_BASE/lib
kopiert werden.
Die Nutzerverwaltung erfordert die ansonsten nicht in Javascript enthaltene Erweiterung zur Verarbeitung von HTML-Vorlagen auf der Instanz von Tomcat, auf der sie ausgeführt werden soll:
$CATALINA_BASE/webapps/jslib/mustache (>=2.3.0)
$CATALINA_BASE
meint das in der der Datei RUNNING.txt der Tomcat-Dokumentation so bezeichnete Verzeichnis. Nachfolgend die Quelle, von der diese Abhängigkeit bezogen werden kann:
Zur Verwaltung von Benutzern in einer Datenbank muss ein Derby-Datenbankserver im Zugriff der Nutzerverwaltung sein. Im Auslieferungszustand der Nutzerverwaltung ist dies in der Datei $UM/web/META-INF/context.xml
als Uniform Resource Locator (URL) jdbc:derby://localhost:1527
konfiguriert. Damit wird auf einen Derby-Server auf Port 1527 der lokalen Maschine verwiesen. Dieser Eintrag muss geändert werden, wenn sich der Datenbankserver an einem anderen Ort befindet.
Für den Zugriff auf den Datenbankserver muss sich der Datenbanktreiber derbyclient.jar
aus der Distribution von Derby im Verzeichnis $CATALINA_BASE/lib
befinden.
Die Nutzerverwaltung wird per Deploy auf Tomcat installiert und kann anschließend von Benutzern mit der Rolle nutzerAdmin
ausgeführt werden. Beim ersten Start wird die Benutzerdatenbank erstellt und darin ein Benutzer admin
, Kennwort admin
, mit dem neue Benutzer und Rollen angelegt werden können.
Damit Tomcat die von der Nutzerverwaltung verwaltete Nutzerdatenbank verwendet, müssen in der Datei $CATALINA_BASE/conf/server.xml
Änderungen gemacht werden, die weiter unten beispielhaft beschrieben sind. Wichtig ist, für die Umstellung auf eine Nutzerdatenbank die folgende Reihenfolge einzuhalten.
Danach muss Tomcat neu gestartet werden.
Zu Beginn der Datei $CATALINA_BASE/conf/server.xml
wird die DataSource angegeben, die den Ablageort der Benutzerdatenbank angibt:
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
<Resource name="jdbc/NewUserDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.apache.derby.jdbc.ClientDriver"
url="jdbc:derby://localhost:1527/udb;create=true"
maxActive="60"
maxIdle="30"
maxWait="5000"
/>
</GlobalNamingResources>
Weiter unten in der Datei $CATALINA_BASE/conf/server.xml
ist der Realm angegeben, der die Benutzerdaten für Authentifizierung und Autorisierung an Tomcat übergibt.
vorher
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!-- weitere Einträge ... -->
nachher
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/NewUserDB"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name">
<CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" algorithm="sha-256" />
</Realm>
</Realm>
<!-- weitere Einträge ... -->
Bitte beachten: Ab Version 8.5 von Tomcat wurde die Verschlüsselung auf SHA-256 umgestellt. Dies muss dem Realm mit dem oben aufgeführten CredentialHandler vermittelt werden.
Die Nutzerverwaltung legt Kennworte verschlüsselt in der Datenbank ab. Laut Dokumentation von Tomcat wird dafür die Klasse RealmBase
verwendet. Damit innerhalb der Nutzerverwaltung auch andere Mechanismen verwendet werden können, wird die Schnittstelle de.uhilger.um.Digester
verwendet. Die Klasse de.uhilger.um.TomcatDigester
implementiert diese und setzte dort bislang die zuvor erwähnte Klasse RealmBase
von Tomcat ein.
Mit Tomcat 9 wurde die Methode Digest() der Klasse RealmBase ohne Angabe von Gründen entfernt, obwohl diese Methode von der Tomcat-Dokumentation auch in Verison 9 und 10 von Tomcat als diejenige zur dynamischen Erzeugung von verschlüsslten Kennworten beschrieben wird. In der Klasse TomcatDigester
ist daher auf die Verwendung der Klasse MessageDigestCredentialHandler
umgestellt worden.
Im Deployment Descriptor $UM/web/WEB-INF/web.xml
ist der Context Parameter digester
hinterlegt und standardmäßig auf de.uhilger.um.TomcatDigester
eingestellt. Soll eine andere Form der Verschlüsselung genutzt werden, kann dies mit einer eigenen Implementierung der Schnittstelle de.uhilger.um.Digester
erreicht und entsprechend im Deployment Descriptor umkonfiguriert werden.