Im Beitrag [post id=4748]Sicherheit durch Zugriffsbeschränkungen in JEE Web-Anwendungen[/post] wurde gezeigt, wie man bestimmte Seiten nur für gewisse Benutzer und Benutzergruppen sichtbar macht. Allerdings musste man diese Benutzer direkt in der Konfigurationsdatei vom Apache Tomcat 7 Application Server eintragen. Das ist nicht besonders flexibel. Deswegen werden wir im nächsten Schritt die Zugriffsberechtigungen aus einer MySQL-Datenbank holen. Dafür können wir unsere bestehende JDBC-Ressource jdbc/foo4
(aus dem Beispiel [post id=4709]JDBC-Ressource über JNDI referenzieren und mit Tomcat verwenden[/post]) benutzen.
Benutzer und Benutzergruppen in MySQL-Datenbank anlegen
script.sql
1 2 3 4 5 6 7 | USE `foo4` -- Create necessary tables create table users (user_name varchar(15) not null primary key, user_pass varchar(15) not null); create table user_roles (user_name varchar(15) not null, role_name varchar(15) not null, primary key (user_name, role_name)); -- Insert sample data INSERT INTO users(user_name,user_pass) VALUES ('benny','test'); INSERT INTO user_roles(user_name,role_name) VALUES ('benny','admin'); |
Tomcat JDBCRealm anlegen
src/main/webapp/META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?> <Context antiJARLocking="true" path="/my-webapp"> <!-- JDBC DataSource --> <Resource name="jdbc/foo4" type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/foo4" username="root" password="root" maxActive="8" maxIdle="4" maxWait="10000" auth="Container" /> <!-- JDBCRealm --> <Realm localDataSource="true" className="org.apache.catalina.realm.DataSourceRealm" dataSourceName="jdbc/foo4" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name"/> </Context> |
Das war’s schon! Ab jetzt werden die Benutzer nicht mehr aus der Datei %CATALINA_HOME%\conf\tomcat-users.xml
geladen, sondern aus der MySQL-Datenbank namens foo4
.
Wichtig: Das Realm
muss die Eigenschaft localDataSource
auf true
gesetzt haben, weil das Realm
lokal in der context.xml der Web-Applikation definiert wird.