ulrich
2020-05-17 1d0223f074e395b3fd1fc92fac2ebc139014f770
commit | author | age
ecccfc 1 # Nutzerverwaltung
U 2
3 Eine Webanwendung zur Verwaltung von Benutzern eines Tomcat Web- und Applikationsservers in einer Derby-Datenbank.
4
ecd3bb 5 ## Funktionen
U 6
7 Die Nutzerverwaltung stellt die folgenden Funktionen bereit
8
9 - Anlegen neuer Benutzer
10 - Löschen von Benutzern
11 - Anlegen neuer Rollen
12 - Löschen von Rollen
13 - Rollen erteilen
14 - Rollen entziehen
15
e4f4a9 16 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.
ecd3bb 17
1d0223 18 Weitere Informationen zur Nutzerverwaltung finden sich auf der [Produktseite] (/data/pg/Nutzerverwaltung)
ecd3bb 19
667ccf 20 ## Webanwendung herstellen
U 21
22 Zum Herstellen der Webanwendung wird ein Java Development Kit (JDK) benötigt, wie es z.B. von [Azul](http://azul.com) oder dem [OpenJDK-Projekt](http://openjdk.java.net/) 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
23
24 ```
3cd7fe 25 Bibliothek  Datei(en)              Ablageort lokal
U 26 ----------  ---------              ---------------
27 Tomcat .... lib/servlet-api.jar .. $CATALINA_HOME
28 XStream ... xstream-1.4.7.jar .... $JLIB
29 Jettison .. jettison-1.3.3.jar ... $JLIB
30 BaseLink .. BaseLink.jar ......... $JLIB
31 Transit ... Transit.jar .......... $JLIB
667ccf 32 ```
U 33 Diese sind an folgenden Orten frei erhältlich:
34
35 - [Apache Tomcat](http://tomcat.apache.org)
36 - [XStream](https://github.com/codehaus/xstream)
37 - [Jettison](https://github.com/codehaus/jettison)
1d0223 38 - [BaseLink](https://uhilger.de/gitblit/docs/BaseLink.git)
U 39 - [Transit](https://uhilger.de/gitblit/docs/Transit.git)
667ccf 40
56a185 41 Nach Beschaffung des JDK und der oben angegebenen Klassenbibliotheken wird der Quellcode aus diesem Git-Repository an einen frei wählbaren lokalen Ablageort [heruntergeladen](http://uhilger.de/gitblit/zip/?r=um.git&h=master&format=zip) 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.
667ccf 42
U 43 Zur Herstellung der Nutzerverwaltung werden die folgenden Kommandos ausgeführt (Beispiel für Linux):
44
45 ```
46 cd $UM
47 mkdir dist build
48 cp -r web/* build
49 cd build/WEB-INF
50 mkdir classes lib
51 cd ../..
52 cp $JLIB/* build/WEB-INF/lib
53
54 $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
55
56 $JDK/bin/jar -cf dist/um.war -C build .
57 rm -r build
58 ```
59
60 Das Webarchiv der Nutzerverwaltung liegt anschließend als `$UM/dist/um.war` fertig zum Deployment bereit.
61
62 ### Distributionsalternative
63
64 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.
65
66 ## Abhängigkeiten
67
1d0223 68 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:
667ccf 69
U 70 ```
3cd7fe 71 $CATALINA_BASE/webapps/jslib/mustache (>=2.3.0)
667ccf 72 ```
U 73
1d0223 74 `$CATALINA_BASE` meint das in der der Datei [RUNNING.txt](http://tomcat.apache.org/tomcat-8.5-doc/RUNNING.txt) der Tomcat-Dokumentation so bezeichnete Verzeichnis. Nachfolgend die Quelle, von der diese Abhängigkeit bezogen werden kann:
667ccf 75
U 76 - [Mustache](https://github.com/janl/mustache.js)
77
a3d357 78 ### Datenbank
U 79
e4f4a9 80 Zur Verwaltung von Benutzern in einer Datenbank muss ein [Derby-Datenbankserver](http://db.apache.org/derby) 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.
a3d357 81
U 82 Für den Zugriff auf den Datenbankserver muss sich der Datenbanktreiber `derbyclient.jar` aus der Distribution von Derby im Verzeichnis `$CATALINA_BASE/lib` befinden.
eda15d 83
U 84 ## Nutzerverwaltung auf Tomcat einschalten
85
e4f4a9 86 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.
d313b3 87
8a1728 88 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.
eda15d 89
d3269d 90 1. Datenbankserver starten
U 91 1. Tomcat mit alten Benutzereinstellungen starten
92 1. Die Nutzerverwaltung auf Tomcat installieren (Deploy)
8a1728 93 1. DataSource hinzufügen (s.u.)
U 94 1. Realm umstellen (s.u.)
a41422 95
U 96 Danach muss Tomcat neu gestartet werden.
97
98 ### DataSource hinzufügen
99
100 Zu Beginn der Datei `$CATALINA_BASE/conf/server.xml` wird die DataSource angegeben, die den Ablageort der Benutzerdatenbank angibt:
101
102 ```
103   <!-- Global JNDI resources
104        Documentation at /docs/jndi-resources-howto.html
105   -->
106   <GlobalNamingResources>
107     <!-- Editable user database that can also be used by
108          UserDatabaseRealm to authenticate users
109     -->
110     <Resource name="UserDatabase" auth="Container"
111               type="org.apache.catalina.UserDatabase"
112               description="User database that can be updated and saved"
113               factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
114               pathname="conf/tomcat-users.xml" />
e4f4a9 115
a41422 116     <Resource name="jdbc/NewUserDB"
U 117           auth="Container"
118           type="javax.sql.DataSource"
119           driverClassName="org.apache.derby.jdbc.ClientDriver"
120           url="jdbc:derby://localhost:1527/udb;create=true"
121           maxActive="60"
122           maxIdle="30"
123           maxWait="5000"
124       />
125   </GlobalNamingResources>
126 ```
127
128 ### Realm umstellen
129
130 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.
eda15d 131
U 132 vorher
133
134 ```
3cd7fe 135 <Engine name="Catalina" defaultHost="localhost">
eda15d 136
3cd7fe 137   <Realm className="org.apache.catalina.realm.LockOutRealm">
U 138     <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
139            resourceName="UserDatabase"/>
140   </Realm>
eda15d 141
3cd7fe 142   <!-- weitere Einträge ... -->
eda15d 143 ```
U 144
145
146 nachher
147
148 ```
3cd7fe 149 <Engine name="Catalina" defaultHost="localhost">
eda15d 150
3cd7fe 151   <Realm className="org.apache.catalina.realm.LockOutRealm">
a41422 152     <Realm className="org.apache.catalina.realm.DataSourceRealm"
U 153         dataSourceName="jdbc/NewUserDB"
154         userTable="users" userNameCol="user_name" userCredCol="user_pass"
155         userRoleTable="user_roles" roleNameCol="role_name">
3cd7fe 156         <CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" algorithm="sha-256" />
a41422 157     </Realm>
3cd7fe 158   </Realm>
eda15d 159
3cd7fe 160   <!-- weitere Einträge ... -->
a41422 161 ```
eda15d 162
a41422 163 **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.
eda15d 164
U 165 ## Verschlüsselung von Kennworten
166
a41422 167 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.
U 168
2c4bbb 169 Mit Tomcat 9 wurde die Methode [Digest()](https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/realm/RealmBase.html#Digest\(java.lang.String,%20java.lang.String,%20java.lang.String\)) der Klasse RealmBase ohne Angabe von Gründen entfernt, obwohl diese Methode von der [Tomcat-Dokumentation](https://tomcat.apache.org/tomcat-9.0-doc/realm-howto.html#Digested_Passwords) 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.
eda15d 170
U 171 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.