ulrich
2020-12-30 e3c1508dd215fb289f705cc3d0c41bbe28bb942a
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
27d42f 67 Die Nutzerverwaltung erfordert zur Verarbeitung von HTML-Vorlagen Mustache auf der Instanz von Tomcat, auf der sie ausgeführt werden soll. Zudem wird der Font Roboto Condensed verwendet, der von Google Fonts erhältlich ist. Beide Teile werden im ROOT-Kontext von Tomcat wie folgt hinterlegt:
667ccf 68
U 69 ```
92e511 70 $CATALINA_BASE/webapps/ROOT/jslib/mustache (>=2.3.0)
U 71 $CATALINA_BASE/webapps/ROOT/fonts/Roboto_Condensed/RobotoCondensed-Regular.ttf
667ccf 72 ```
U 73
27d42f 74 `$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 Quellen, von denen Mustache und der Font bezogen werden können:
667ccf 75
U 76 - [Mustache](https://github.com/janl/mustache.js)
27d42f 77 - [Roboto Condensed](https://fonts.google.com/specimen/Roboto+Condensed)
667ccf 78
a3d357 79 ### Datenbank
U 80
e4f4a9 81 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 82
U 83 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 84
U 85 ## Nutzerverwaltung auf Tomcat einschalten
86
e4f4a9 87 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 88
8a1728 89 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 90
d3269d 91 1. Datenbankserver starten
U 92 1. Tomcat mit alten Benutzereinstellungen starten
93 1. Die Nutzerverwaltung auf Tomcat installieren (Deploy)
8a1728 94 1. DataSource hinzufügen (s.u.)
U 95 1. Realm umstellen (s.u.)
a41422 96
U 97 Danach muss Tomcat neu gestartet werden.
98
99 ### DataSource hinzufügen
100
101 Zu Beginn der Datei `$CATALINA_BASE/conf/server.xml` wird die DataSource angegeben, die den Ablageort der Benutzerdatenbank angibt:
102
103 ```
104   <!-- Global JNDI resources
105        Documentation at /docs/jndi-resources-howto.html
106   -->
107   <GlobalNamingResources>
108     <!-- Editable user database that can also be used by
109          UserDatabaseRealm to authenticate users
110     -->
111     <Resource name="UserDatabase" auth="Container"
112               type="org.apache.catalina.UserDatabase"
113               description="User database that can be updated and saved"
114               factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
115               pathname="conf/tomcat-users.xml" />
e4f4a9 116
a41422 117     <Resource name="jdbc/NewUserDB"
U 118           auth="Container"
119           type="javax.sql.DataSource"
120           driverClassName="org.apache.derby.jdbc.ClientDriver"
121           url="jdbc:derby://localhost:1527/udb;create=true"
122           maxActive="60"
123           maxIdle="30"
124           maxWait="5000"
125       />
126   </GlobalNamingResources>
127 ```
128
129 ### Realm umstellen
130
131 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 132
U 133 vorher
134
135 ```
3cd7fe 136 <Engine name="Catalina" defaultHost="localhost">
eda15d 137
3cd7fe 138   <Realm className="org.apache.catalina.realm.LockOutRealm">
U 139     <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
140            resourceName="UserDatabase"/>
141   </Realm>
eda15d 142
3cd7fe 143   <!-- weitere Einträge ... -->
eda15d 144 ```
U 145
146
147 nachher
148
149 ```
3cd7fe 150 <Engine name="Catalina" defaultHost="localhost">
eda15d 151
3cd7fe 152   <Realm className="org.apache.catalina.realm.LockOutRealm">
a41422 153     <Realm className="org.apache.catalina.realm.DataSourceRealm"
U 154         dataSourceName="jdbc/NewUserDB"
155         userTable="users" userNameCol="user_name" userCredCol="user_pass"
156         userRoleTable="user_roles" roleNameCol="role_name">
3cd7fe 157         <CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" algorithm="sha-256" />
a41422 158     </Realm>
3cd7fe 159   </Realm>
eda15d 160
3cd7fe 161   <!-- weitere Einträge ... -->
a41422 162 ```
eda15d 163
a41422 164 **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 165
U 166 ## Verschlüsselung von Kennworten
167
a41422 168 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 169
2c4bbb 170 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 171
U 172 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.