Wer Zugriffsbeschränkungen für Webseiten seiner Java Web-Applikation einrichten möchte, der wird sich früher oder später mit den Web Content Security Constraints beschäftigen. Das Konzept dahinter ist ganz einfach. Man definiert Bereiche (oder auch Ressourcen) und legt dann fest, dass nur bestimmte Benutzer (mit Benutzernamen und Passwort) und/oder Gruppen (Admins, Gäste, etc.) Zugriff auf diese Bereiche haben. Wie das in Verbindung mit einem Apache Tomcat 7-Application Server funktioniert, möchte ich gerne zeigen.
1. Zugriffsbeschränkungen definieren
src\main\webapp\WEB-INF\web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!-- Definition of access restrictions (pages and allowed access) --> <security-constraint> <display-name>General Restriction</display-name> <!-- Access restricted sites / resources --> <web-resource-collection> <web-resource-name>Entire Application</web-resource-name> <description>All resources in this application are protected.</description> <url-pattern>/*</url-pattern> </web-resource-collection> <!-- Authorized roles list --> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> <!-- Authentication method --> <login-config> <auth-method>FORM</auth-method> <realm-name>Administration Area</realm-name> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/error.jsp</form-error-page> </form-login-config> </login-config> <!-- Security roles used by the application --> <security-role> <role-name>admin</role-name> </security-role> ... |
2. Login-Seite anlegen
src\main\webapp\login.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Login</title> </head> <body> <h1>Login</h1> <form method="POST" action="j_security_check"> <table> <tr> <td>Username:</td> <td> <input type="text" name="j_username" /> </td> </tr> <tr> <td>Password:</td> <td><input type="password" name="j_password" /></td> </tr> </table> <input type="submit" value="Login" /> </form> </body> </html> |
3. Seite für fehlerhaften Login anlegen
src\main\webapp\error.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Error</title> </head> <body> <h1>Error</h1> <p> Invalid username and/or password. </p> </body> </html> |
4. Benutzer und Rollen verwalten
%CATALINA_HOME%\conf\tomcat-users.xml
Wird jetzt eine beliebige Seite der Applikation aufgerufen, wird man aufgefordert, sich am System anzumelden. Das Beispiel ist so eingestellt, dass nur Benutzern aus der Gruppe admin
der Zugriff erlaubt ist. Doch wo ist diese Gruppe definiert? Standardmäßig ist diese Gruppe in der Datei tomcat-users.xml
zu finden (Bsp.: apache-tomcat-7.0.29\conf\tomcat-users.xml
bzw. %CATALINA_HOME%\conf\tomcat-users.xml
).
Dort sieht man folgenden Eintrag:
1 2 3 4 5 | <?xml version="1.0" encoding="UTF-8"?> <tomcat-users> <user password="tomcat" roles="manager-script,admin" username="tomcat"/> <user password="admin" roles="manager-script,admin" username="admin"/> </tomcat-users> |
Meldet man sich also mit dem Benutzernamen tomcat
und dem Passwort tomcat
an, dann funktioniert der Zugriff, weil der Benutzer tomcat
die Rolle admin
hat.