Für die Umsetzung von Autorisierung werden in der Datenbank 3 Tabellen für die Verwaltung von Benutzer, Rollen und Rechte benötigt, die jeweils durch eine n:m Relation miteinander verknüpft sind. Per Assistent können Sie sich die entsprechenden Entities dafür generieren lassen. Zusätzlich werden die Entities durch ein Mapping miteinander verknüpft. Dadurch kann RapidClipse mit beliebigen Bezeichnungen von Entities und Attributen umgehen. Falls das Standard-Mapping für Ihre Datenstruktur ungeeignet ist, können Sie dafür benutzerdefinierte Abfragen definieren.
Auch wenn Sie die Authentifizierung via LDAP nutzen, müssen Sie die Benutzer in einer Datenbanktabelle speichern, um Benutzer und Rollen miteinander verknüpfen zu können. Benutzer und Rollen müssen zur Laufzeit synchronisiert werden.
Benötigte Datenstruktur allgemein
Benutzer - Speicherung von Benutzername, Passwort und ggf. zusätzliche nutzerspezifische Informationen. In RapidClipse APIs verwendete Bezeichnungen: User, Subject.
Rollen - Speicherung der Rollen / Gruppen die ein Benutzer angehören kann. In RapidClipse APIs verwendete Bezeichnungen: Roles, Usergroups, Userroles.
Rechte - Speicherung der Rechte die eine Rolle besitzen kann. Hier können auch Zustände oder Bedingungen gespeichert werden die erfüllt sein müssen. In RapidClipse APIs verwendete Bezeichnungen: Permissions, Resources.
Von RapidClipse generierte Datenstruktur
Entities
Entity | Attribute | Datentyp | Erklärung |
User | username | String | Speichert den Benutzernamen als String. |
password | byte[] | Speichert das Passwort als Byte-Array, i.d.R. verschlüsselt. | |
roles | Set / List | Liste aller Rollen. | |
Role | name | String | Speichert die Bezeichnung der Rollen als String. |
resources | Set / List | Liste aller Rechte. | |
childRoles | Set / List | Liste aller Rollen. | |
parentRoles | Set / List | Liste aller Rollen. | |
users | Set / List | Liste aller Benutzer. | |
Resource | name | String | Speichert die Bezeichnung einer Berechtigung als String. |
roles | Set / List | Liste aller Rollen. |
Data Access
UserDAO
RoleDAO
ResourceDAO
Datenbanktabellen (am Beispiel MySQL) - Durch der (Hibernate) Entity-Export-Funktion generierte Datenbanktabellen.
Entity | Datenfelder | Datentyp | Erklärung |
USER | USERNAME | varchar(255) | Speichert die Benutzerdaten, u.a. Benutzername und Passwort. |
password | tinyblob | ||
ROLE | NAME | varchar(255) | Speichert alle Rollen. |
RESOURCE | NAME | varchar(255) | Speichert alle Rechte. |
ROLERESOURCENM | ROLE | varchar(255) | Speichert alle Rolle-Recht Kombinationen. Eine Rolle kann viele Rechte haben, ein Recht kann in vielen Rollen vorkommen. |
RESOURCE | varchar(255) | ||
ROLEROLENM | CHILDROLE | varchar(255) | Speichert alle Rolle-Rolle Kombinationen und ermöglicht dadurch die Verschachtelung von Rollen. |
PARENTROLE | varchar(255) | ||
USERROLENM | USER | varchar(255) | Speichert alle Benutzer-Rolle Kombinationen. Ein Benutzer kann viele Rollen haben, eine Rolle kann von vielen Benutzern eingenommen werden. |
ROLE | varchar(255) |
Umgang mit vorhandener Datenbank - Sind in Ihrer Datenbank bereits Tabellen für die Verwaltung von Benutzern, Rollen und Rechten vorhanden, stellen Sie sicher, dass für jede Tabelle ein entsprechendes Entity mit dazugehörigem DAO in Ihrem Project Management unter Entities bzw. Data Access vorhanden ist. Falls nicht, können Sie die fehlenden Entities und DAOs mit der Import-Funktion Create JPA entities from table generieren lassen. Abweichende Tabellen- und Datenfeldnamen stellen auf Grund des später durchgeführten Mappings kein Problem dar.
Resource name - Auswahl des Attributs für die Bezeichnung der Benutzerrechte.
Mapping - Wenn Sie das Entity Resource generieren lassen, können Sie das vorgegebene Attribut Resource.name übernehmen.
Project Management > Entities - Es wird die Entity-Klasse Resource.java generiert oder durch Auswahl ein bereits existierendes Entity verwendet.
Entity | Attribute | Datentyp |
Resource | name | String |
Project Management > Data Access - Es wird die DAO-Klasse ResourceDAO.java generiert. Bei Auswahl eines bereits existierenden Entities wird kein neues DAO generiert.
Role name - Auswahl des Attributs für die Bezeichnung der Rollen.
Resources - Auswahl des Attributs mit der Liste (Set/List) aller Rechte für eine Rolle.
Child roles - Auswahl des Attributs mit der Liste (Set/List) aller Unterrollen für eine Rolle.
Mapping - Wenn Sie das Entity Role generieren lassen, können Sie die vorgegebenen Attribute übernehmen.
Project Management > Entities
Role - Es wird die Entity-Klasse Role.java generiert oder durch Auswahl ein bereits existierendes Entity verwendet.
Entity | Attribute | Datentyp |
Role | name | String |
resources | Set / List | |
childRoles | Set / List | |
parentRoles | Set / List |
Resource - Die Entity-Klasse Resource.java wird um das Attribut roles erweitert.
Entity | Attribute | Datentyp |
Resource | name | String |
roles | Set / List |
Project Management > Data Access - Es wird die DAO-Klasse RoleDAO.java generiert. Bei Auswahl eines bereits existierenden Entities wird kein neues DAO generiert.
Subject name - Auswahl des Attributs für den Benutzernamen.
Roles - Auswahl des Attributs mit der Liste (Set/List) aller Rollen eines Benutzers.
Project Management > Entities
Role - Die Entity-Klasse Role.java wird um das Attribut users erweitert.
Entity | Attribute | Datentyp |
Role | name | String |
resources | Set / List | |
childRoles | Set / List | |
parentRoles | Set / List | |
users | Set / List |
User - Die Entity Klasse User.java wird um das Attribut roles erweitert.
Entity | Attribute | Datentyp |
User | username | String |
password | byte[] | |
roles | Set / List |
Project Management > Data Access - Es wird die DAO-Klasse RoleDAO.java generiert. Bei Auswahl eines bereits existierenden Entities wird kein neues DAO generiert.
Project Management > Business Objects - Es wird die Klasse ExampleAuthorizationProvider.java generiert.
package com.company.example.business; import com.company.example.entities.Resource; import com.company.example.entities.Role; import com.company.example.entities.User; import com.xdev.security.authorization.AuthorizationConfiguration; import com.xdev.security.authorization.AuthorizationConfigurationProvider; import com.xdev.security.authorization.jpa.JPAAuthorizationConfigurationProvider; public class ExampleAuthorizationConfigurationProvider implements AuthorizationConfigurationProvider { private static ExampleAuthorizationConfigurationProvider INSTANCE; public static ExampleAuthorizationConfigurationProvider getInstance() { if (INSTANCE == null) { INSTANCE = new ExampleAuthorizationConfigurationProvider(); } return INSTANCE; } private JPAAuthorizationConfigurationProvider provider; private ExampleAuthorizationConfigurationProvider() { } @Override public AuthorizationConfiguration provideConfiguration() { if (this.provider == null) { this.provider = new JPAAuthorizationConfigurationProvider(User.class, Role.class, Resource.class); } return this.provider.provideConfiguration(); } } |
Für die neu generierten Entities User, Role und Resource müssen entsprechende Tabellen in der Datenbank angelegt werden.
Entity > Datenbank Export (Create tables)
Es ist hilfreich für die Datenbanktabellen USER, ROLE und RESOURCE einige Default-Daten einzugeben.