Datenbank als Identity Provider

Es wird gezeigt wie eine Datenbank als Quelle für einen Identity Provider verwendet wird.

Voraussetzungen

  1. Die Datenbank-Verbindung steht als Backend Connection vom Typ data_source zur Verfügung. Die ID der Backend Connection Komponente ist hierbei der dataSourceName.

  2. 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.

Name (Key) Gruppe Wert Beschreibung

Module_Name
(module_name)

module

idp-oracle

Einen sprechenden und eindeutigen Namen vergeben.

IdentityProvider
(identityProvider)

config

jdbc

Der Wert jdbc, damit JAAS DB verwendet wird.

IdentityProvider_Configuration
(identityProvider_configuration)

config

[source,json] ---- { "datasource": "oracle-xe-vpma" } ----

Unter datasource die ID der zu verwendenden Backend Connection vom Typ data_source eintragen.

IdentityProvider_Mappings
(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 bpcadmin User.

virtimo@bpc()> jaas:role-add user_x role_y
... siehe unten ...

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')"

Keywords: