ulrich
2020-12-28 df19d75203dde02dc574a94b1572cd942967ae20
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
14673a 15 - Eigenes Kennwort ändern
ecd3bb 16
14673a 17 Die responsive Bedienoberfläche passt sich an verschiedene Geräteausstattungen an. Weitere Informationen auf der [Produktseite](https://uhilger.de/data/pg/Nutzerverwaltung/).
ecd3bb 18
667ccf 19 ## Webanwendung herstellen
U 20
21 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
22
23 ```
3cd7fe 24 Bibliothek  Datei(en)              Ablageort lokal
U 25 ----------  ---------              ---------------
26 Tomcat .... lib/servlet-api.jar .. $CATALINA_HOME
27 XStream ... xstream-1.4.7.jar .... $JLIB
28 Jettison .. jettison-1.3.3.jar ... $JLIB
29 BaseLink .. BaseLink.jar ......... $JLIB
30 Transit ... Transit.jar .......... $JLIB
667ccf 31 ```
U 32 Diese sind an folgenden Orten frei erhältlich:
33
34 - [Apache Tomcat](http://tomcat.apache.org)
35 - [XStream](https://github.com/codehaus/xstream)
36 - [Jettison](https://github.com/codehaus/jettison)
1d0223 37 - [BaseLink](https://uhilger.de/gitblit/docs/BaseLink.git)
U 38 - [Transit](https://uhilger.de/gitblit/docs/Transit.git)
667ccf 39
56a185 40 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 41
U 42 Zur Herstellung der Nutzerverwaltung werden die folgenden Kommandos ausgeführt (Beispiel für Linux):
43
44 ```
45 cd $UM
46 mkdir dist build
47 cp -r web/* build
48 cd build/WEB-INF
49 mkdir classes lib
50 cd ../..
51 cp $JLIB/* build/WEB-INF/lib
52
53 $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
54
55 $JDK/bin/jar -cf dist/um.war -C build .
56 rm -r build
57 ```
58
59 Das Webarchiv der Nutzerverwaltung liegt anschließend als `$UM/dist/um.war` fertig zum Deployment bereit.
60
61 ### Distributionsalternative
62
63 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.
64
65 ## Abhängigkeiten
66
14673a 67 Die Nutzerverwaltung erfordert die Erweiterung zur Verarbeitung von HTML-Vorlagen Mustache auf der Instanz von Tomcat, auf der sie ausgeführt werden soll:
667ccf 68
U 69 ```
3cd7fe 70 $CATALINA_BASE/webapps/jslib/mustache (>=2.3.0)
667ccf 71 ```
U 72
14673a 73 `$CATALINA_BASE` im obigen Beispiel 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 Mustache bezogen werden kann:
667ccf 74
U 75 - [Mustache](https://github.com/janl/mustache.js)
76
a3d357 77 ### Datenbank
U 78
e4f4a9 79 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 80
U 81 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 82
U 83 ## Nutzerverwaltung auf Tomcat einschalten
84
e4f4a9 85 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 86
8a1728 87 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 88
d3269d 89 1. Datenbankserver starten
U 90 1. Tomcat mit alten Benutzereinstellungen starten
91 1. Die Nutzerverwaltung auf Tomcat installieren (Deploy)
8a1728 92 1. DataSource hinzufügen (s.u.)
U 93 1. Realm umstellen (s.u.)
a41422 94
U 95 Danach muss Tomcat neu gestartet werden.
96
97 ### DataSource hinzufügen
98
99 Zu Beginn der Datei `$CATALINA_BASE/conf/server.xml` wird die DataSource angegeben, die den Ablageort der Benutzerdatenbank angibt:
100
101 ```
102   <!-- Global JNDI resources
103        Documentation at /docs/jndi-resources-howto.html
104   -->
105   <GlobalNamingResources>
106     <!-- Editable user database that can also be used by
107          UserDatabaseRealm to authenticate users
108     -->
109     <Resource name="UserDatabase" auth="Container"
110               type="org.apache.catalina.UserDatabase"
111               description="User database that can be updated and saved"
112               factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
113               pathname="conf/tomcat-users.xml" />
e4f4a9 114
a41422 115     <Resource name="jdbc/NewUserDB"
U 116           auth="Container"
117           type="javax.sql.DataSource"
118           driverClassName="org.apache.derby.jdbc.ClientDriver"
119           url="jdbc:derby://localhost:1527/udb;create=true"
120           maxActive="60"
121           maxIdle="30"
122           maxWait="5000"
123       />
124   </GlobalNamingResources>
125 ```
126
127 ### Realm umstellen
128
129 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 130
U 131 vorher
132
133 ```
3cd7fe 134 <Engine name="Catalina" defaultHost="localhost">
eda15d 135
3cd7fe 136   <Realm className="org.apache.catalina.realm.LockOutRealm">
U 137     <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
138            resourceName="UserDatabase"/>
139   </Realm>
eda15d 140
3cd7fe 141   <!-- weitere Einträge ... -->
eda15d 142 ```
U 143
144
145 nachher
146
147 ```
3cd7fe 148 <Engine name="Catalina" defaultHost="localhost">
eda15d 149
3cd7fe 150   <Realm className="org.apache.catalina.realm.LockOutRealm">
a41422 151     <Realm className="org.apache.catalina.realm.DataSourceRealm"
U 152         dataSourceName="jdbc/NewUserDB"
153         userTable="users" userNameCol="user_name" userCredCol="user_pass"
154         userRoleTable="user_roles" roleNameCol="role_name">
3cd7fe 155         <CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" algorithm="sha-256" />
a41422 156     </Realm>
3cd7fe 157   </Realm>
eda15d 158
3cd7fe 159   <!-- weitere Einträge ... -->
a41422 160 ```
eda15d 161
a41422 162 **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 163
U 164 ## Verschlüsselung von Kennworten
165
a41422 166 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 167
2c4bbb 168 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 169
U 170 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.