Datenbank als Identity Provider
Es wird gezeigt wie eine Datenbank als Quelle für einen Identity Provider verwendet wird.
Voraussetzungen
-
Die Datenbank-Verbindung steht als Backend Connection vom Typ
data_source
zur Verfügung. Die ID der Backend Connection Komponente ist hierbei derdataSourceName
. -
In der Datenbank sind die User, Rollen und Gruppen Tabellen bereits angelegt
CREATE TABLE BPC_USERS (USERNAME VARCHAR(255) PRIMARY KEY NOT NULL, PASSWORD VARCHAR(255) NOT NULL,FIRSTNAME VARCHAR(255),LASTNAME VARCHAR(255),EMAIL VARCHAR(255)); CREATE TABLE BPC_ROLES (USERNAME VARCHAR(255) NOT NULL, ROLENAME VARCHAR(255) NOT NULL, PRIMARY KEY (USERNAME,ROLENAME)); CREATE TABLE BPC_GROUPS (USERNAME VARCHAR(255) NOT NULL, GROUPNAME VARCHAR(255) NOT NULL, PRIMARY KEY (USERNAME,GROUPNAME));
oder hier alternativ dasselbe für die Ausführung direkt in der Karaf-Console (Vorher noch den korrekten dataSourceName einsetzen!)
jdbc:execute <dataSourceName> "CREATE TABLE BPC_USERS (USERNAME VARCHAR(255) PRIMARY KEY NOT NULL, PASSWORD VARCHAR(255) NOT NULL,FIRSTNAME VARCHAR(255),LASTNAME VARCHAR(255),EMAIL VARCHAR(255))" jdbc:execute <dataSourceName> "CREATE TABLE BPC_ROLES (USERNAME VARCHAR(255) NOT NULL, ROLENAME VARCHAR(255) NOT NULL, PRIMARY KEY (USERNAME,ROLENAME))" jdbc:execute <dataSourceName> "CREATE TABLE BPC_GROUPS (USERNAME VARCHAR(255) NOT NULL, GROUPNAME VARCHAR(255) NOT NULL, PRIMARY KEY (USERNAME,GROUPNAME))"
Konfiguration (JAAS DB)
Es wird eine neue Backend Connection vom Typ identity_provider
angelegt. Dort sind folgende Werte zu setzen.
Setting (Key) | Gruppe | Wert | Beschreibung |
---|---|---|---|
Module_Name |
module |
idp-oracle |
Einen sprechenden und eindeutigen Namen vergeben. |
IdentityProvider |
config |
jdbc |
Der Wert |
IdentityProvider_Configuration |
config |
[source,json] ---- { "datasource": "oracle-xe-vpma" } ---- |
Unter |
IdentityProvider_Mappings |
config |
[source,json] ---- { "organisations": { "DEFAULT": { "assignedRoles": [], "assignedOrganisations": [], "assignedRights": [] } }, "roles": { "bpcuser": { "assignedRoles": [], "assignedRights": [ "loadModule_blank", "loadModule_account", "loadModule_dashboard" ] } }, "rights": {} } ---- |
Hier müssen die Rechte, Rollen und Organisationen hinterlegt werden. Diese müssen anschließend auch in der Karaf Console angelegt werden.
Dazu wie unten beschrieben jedes Recht wenigstens EINEM User zuweisen.
Nur so kann man das jeweilige Objekt auch einem User im BPC zuweisen.
Sinnvollerweise nimmt man hierfür bspw. den
|
Datenbank-Queries
Falls ein anderes Tabellen-Layout als das oben stehende verwendet wird, die Datenbank-Queries entsprechend anpassen.
Diese sind unter [karaf]/etc/de.virtimo.bpc.core.auth.jaas.jdbc.queries.cfg
zu finden.
de.virtimo.bpc.core.auth.jaas.jdbc.queries.cfg
insert.user = INSERT INTO BPC_USERS VALUES(?,?,?,?,?)
insert.role = INSERT INTO BPC_ROLES VALUES(?,?)
insert.group = INSERT INTO BPC_GROUPS VALUES(?,?)
update.pwd = UPDATE BPC_USERS SET PASSWORD=? WHERE USERNAME=?
update.user = UPDATE BPC_USERS SET FIRSTNAME=?, LASTNAME=?, EMAIL=? WHERE USERNAME=?
query.pwd = SELECT PASSWORD FROM BPC_USERS WHERE USERNAME=?
query.user = SELECT USERNAME, FIRSTNAME, LASTNAME, EMAIL FROM BPC_USERS WHERE USERNAME=?
query.users = SELECT USERNAME, FIRSTNAME, LASTNAME, EMAIL FROM BPC_USERS
query.roles_of_user_or_group = SELECT ROLENAME FROM BPC_ROLES WHERE USERNAME=?
query.roles = SELECT ROLENAME FROM BPC_ROLES
query.groups_of_user = SELECT GROUPNAME FROM BPC_GROUPS WHERE USERNAME=?
query.groups = SELECT GROUPNAME FROM BPC_GROUPS
delete.user = DELETE FROM BPC_USERS WHERE USERNAME=?
delete.role = DELETE FROM BPC_ROLES WHERE USERNAME=? AND ROLENAME=?
delete.roles = DELETE FROM BPC_ROLES WHERE USERNAME=?
delete.group = DELETE FROM BPC_GROUPS WHERE USERNAME=? AND GROUPNAME=?
delete.groups = DELETE FROM BPC_GROUPS WHERE USERNAME=?
Benutzer per Karaf-Konsole anlegen
Es ist eine JAAS Implementierung und kann über die Karaf-Konsole angesprochen werden.
Beispiel um den bpcadmin
Benutzer per Karaf-Konsole anzulegen
virtimo@bpc()> jaas:realm-list
Index | Realm Name | Login Module Class Name
-----------------------------------------------------------------------------------
1 | inubit | de.virtimo.bpc.core.auth.jaas.inubit.InubitLoginModule
2 | jdbc | de.virtimo.bpc.core.auth.jaas.jdbc.JDBCLoginModule
3 | karaf | org.apache.karaf.jaas.modules.properties.PropertiesLoginModule
4 | karaf | org.apache.karaf.jaas.modules.publickey.PublickeyLoginModule
5 | karaf | org.apache.karaf.jaas.modules.audit.FileAuditLoginModule
6 | karaf | org.apache.karaf.jaas.modules.audit.LogAuditLoginModule
7 | karaf | org.apache.karaf.jaas.modules.audit.EventAdminAuditLoginModule
# Nun den Benutzer 'bpcadmin' mit dem Passwort 'bpcadmin' anlegen. Dabei wird das Passwort verschlüsselt (SHA-512, hexadezimal) in der Datenbank abgelegt.
# Diesem die Rolle 'bpcadmin' zuweisen und zur Gruppe 'admingroup' hinzufügen.
virtimo@bpc()> jaas:realm-manage --realm jdbc
# Falls die Selektion über realm nicht funktioniert, über den index selektieren:
virtimo@bpc()> jaas:realm-manage --index 2
virtimo@bpc()> jaas:user-add bpcadmin bpcadmin
virtimo@bpc()> jaas:role-add bpcadmin bpcadmin
virtimo@bpc()> jaas:group-add bpcadmin admingroup
virtimo@bpc()> jaas:update
Benutzer Passwörter aus JAAS File übernehmen
Es ist auch möglich, bestehende Passwörter von anderen Systemen per SQL zu migrieren. Das hat den Vorteil, dass sich die User nicht erneut ein PW vergeben müssen.
Bspw.: Falls zuvor das JAAS-File zum Login genutzt wurde, kann man mit diesem Karaf-Consolenbefehl die User und PW’s in die JAAS-DB anlegen:
jdbc:execute datasourcename "insert into bpc_users (username, password) values ('user_x', 'BASE64-Kodiertes-Passwort aus users.properties')"