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