LDAP Authentifizierung

Alles rund um Module und Plugins in CONTENIDO 4.9.
langwebdesign
Beiträge: 73
Registriert: So 23. Okt 2005, 14:11
Wohnort: Titting
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von langwebdesign » Mi 19. Dez 2018, 20:38

Hallo xmurrix,

das mit xdebug ist einfach nur genial, da hätte ich mich schon viel früher mit beschäftigen sollen.

Ich arbeite mich jetzt mal an das Collection->link() Problem heran, erste Erkenntnisse möchte ich hier mal dokumentieren, falls das mal wer anderes auch machen möchte.

Ich habe das mit den Frontend Usern, Gruppen und der Gruppenzuordnung mal ausprobiert und hier etwas funktionierender Code:

Code: Alles auswählen

$feGrMeColl = new cApiFrontendGroupMemberCollection();
$feGrMeColl->link('cApiFrontendGroupCollection');
$feGrMeColl->link('cApiFrontendUserCollection');
$feGrMeColl->addResultField('capifrontendusercollection.username'); // Das ist für jedes Feld, das geladen werden soll, außer den IDs, notwendig
$feGrMeColl->addResultField('cApiFrontendGroupCollection.groupname');
$feGrMeColl->setWhere('capifrontendusercollection.idclient', $client);
$feGrMeColl->query(); // Hier kann man mit xdebug das SQL Statement abgreifen

$fields['idfrontenduser'] = 'idfrontenduser';
$fields['idfrontendgroup'] = 'idfrontendgroup';
$fields['username'] = 'username';
$fields['groupname'] = 'groupname';
$table = $feGrMeColl->fetchTable($fields);
 
foreach ($table as $key => $item) {
    echo "idfrontenduser: ".$item['idfrontenduser']."<br>";
    echo "username: ".$item['username']."<br>";
    echo "idfrontendgroup: ".$item['idfrontendgroup']."<br>";
    echo "groupname: ".$item['groupname']."<br>";
}
Ausgabe sieht dann so aus:

Code: Alles auswählen

idfrontenduser: 1
username: Mustermann
idfrontendgroup : 1
groupname: Mustergruppe
Dank xdebug kam ich an den SQL der generiert wird, was mir Schlussendlich auch geholfen hat den Code anzupassen bis er funktioniert hat, hier der SQL zum Code oben:

Code: Alles auswählen

SELECT capifrontendusercollection.idfrontenduser, capifrontendgroupcollection.idfrontendgroup, capifrontendgroupmembercollection.idfrontendgroupmember, capifrontendusercollection.username, capifrontendgroupcollection.groupname 
FROM `con_frontendgroupmembers` AS capifrontendgroupmembercollection 
LEFT JOIN con_frontendusers AS capifrontendusercollection ON capifrontendgroupmembercollection.idfrontenduser = capifrontendusercollection.idfrontenduser 
LEFT JOIN con_frontendgroups AS capifrontendgroupcollection ON capifrontendgroupmembercollection.idfrontendgroup = capifrontendgroupcollection.idfrontendgroup 
WHERE capifrontendusercollection.idclient = '1'"
Mein größtes Problem war aber anscheinend das die next() Methode nicht mit query() funktioniert.

Code: Alles auswählen

while (($item = $feGrMeColl->next()) !== false) // Das funktioniert nicht
Hier war $item immer sofort false

Soweit erst mal ein Erfolg, jetzt mache ich mich an meine eigene Klasse, die macht mit query() Probleme...

Stephan
Dev Umgebung: Contenido Git Develop Branch, Win 10, PHP 7.2.13, VS Code, XDebug, PHP integrated Webserver
Aktuelle arbeite ich am LDAP Plugin für Frontend (und irgendwann Backend) User, Feedback erwünscht!

xmurrix
Beiträge: 2748
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von xmurrix » Mi 19. Dez 2018, 20:53

Hallo langwebdesign,

habe mir gerade dein Plugin angesehen, ist dir wirklich gut gelungen. Die Installation war reibungslos und die Info mit der Classmap ist auch dabei.

Mir ist folgendes aufgefallen:
In der Datei contenido/plugins/auth_ldap/classes/class.authldap.groupmapping.php sollten die Primärschlüssel "idfrontendgroupmapping" lauten, da steht "frontendgroupmapping" und damit geht das nicht.

In der Datei frontendgroupmapping müsstest du den Code

Code: Alles auswählen

$feGroupMappings = new LDAPGroupMappingCollection();
$feGroupMappings->link('cApiFrontendGroupCollection');

$feGroupMappings->addResultField('objectguidhex');
$feGroupMappings->addResultField('idfrontendgroup');
$feGroupMappings->addResultField('cApiFrontendGroupCollection.groupname');
$feGroupMappings->setWhere('idclient', $client);
$feGroupMappings->query();
gegen folgendes ändern:

Code: Alles auswählen

$feGroupMappings = new LDAPGroupMappingCollection();
$feGroupMappings->link('cApiFrontendGroupCollection');

$feGroupMappings->addResultField('objectguidhex');
$feGroupMappings->addResultField('cApiFrontendGroupCollection.idfrontendgroup');
$feGroupMappings->addResultField('cApiFrontendGroupCollection.groupname');
$feGroupMappings->setWhere('cApiFrontendGroupCollection.idclient', $client);
$feGroupMappings->query();
Wenn man dem $feGroupMappings Objekt Ergebnisfelder hinzufügt, die in der mit link() verbundenen Tabelle vorkommen, weiß die DB nicht, von welcher Tabelle die Werte zu übernehmen sind, daher sollte man die Tabellenkennung an die Feldnamen voranstellen. Ich hatte bei mir Fehlereinträge in der errorlog.txt, es kann aber sein, dass mein DB-Server eine andere Konfiguration hat.

Auch mit der Änderung wird das nicht funktionieren, da das Collection-Objekt hier eine SELECT-Anweisung mit einem LEFT JOIN erstellt, d. h. es holt alle passenden Datensätze aus der Tabelle con_pi_ldap_frontendgroupmapping und fügt die passenden Treffer aus con_frontendgroups der Ergebnismenge hinzu. Da es aber keine Treffer in der Tabelle con_pi_ldap_frontendgroupmapping gibt, die ist ja initial leer, wird auch nichts von con_frontendgroups übernommen und du hast keine Ergebnisse.
Die generierte SQL-Anweisung sieht so aus:

Code: Alles auswählen

SELECT capifrontendgroupcollection.idfrontendgroup, ldapgroupmappingcollection.idfrontendgroupmapping, objectguidhex, capifrontendgroupcollection.idfrontendgroup, capifrontendgroupcollection.groupname 
FROM `con_pi_ldap_frontendgroupmapping` AS ldapgroupmappingcollection 
LEFT JOIN con_frontendgroups AS capifrontendgroupcollection ON ldapgroupmappingcollection.idfrontendgroup = capifrontendgroupcollection.idfrontendgroup 
WHERE capifrontendgroupcollection.idclient = '1';
Mit einem RIGHT JOIN würde das funktionieren:

Code: Alles auswählen

SELECT capifrontendgroupcollection.idfrontendgroup, ldapgroupmappingcollection.idfrontendgroupmapping, objectguidhex, capifrontendgroupcollection.idfrontendgroup, capifrontendgroupcollection.groupname 
FROM `con_pi_ldap_frontendgroupmapping` AS ldapgroupmappingcollection 
RIGHT JOIN con_frontendgroups AS capifrontendgroupcollection ON ldapgroupmappingcollection.idfrontendgroup = capifrontendgroupcollection.idfrontendgroup 
WHERE capifrontendgroupcollection.idclient = '1';
Hier stellt sich die Frage, ob du überhaupt Ergebnisse aus LDAPGroupMappingCollection haben willst und ob das so richtig wäre, da die Tabelle con_pi_ldap_frontendgroupmapping ja keine Datensätze enthält. Eigentlich verhält sich die Klasse LDAPGroupMappingCollection richtig.

Vermutlich ist es besser, zuerst mit der cApiFrontendGroupCollection alle vorhandenen Gruppen zu laden um dann mit den Gruppen-Ids die LDAPGroupMappingCollection zu verwenden.

Gruß
xmurrix
CONTENIDO downloads: CONTENIDO 4.10.1
CONTENIDO links: Documentation, API documentation
CONTENIDO @ Github: CONTENIDO 4.10

langwebdesign
Beiträge: 73
Registriert: So 23. Okt 2005, 14:11
Wohnort: Titting
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von langwebdesign » Mi 19. Dez 2018, 21:10

Hi,

Danke für die Unterstützung, das mit dem Primärschlüssel habe ich auch gerade gefunden, da hatte ich wohl nicht genau aufgepasst was da rein muss.

In der con_pi_ldap_frontendgroupmapping hab ich bei mir manuell einen Eintrag hinzugefügt, das soll später über eine Backend Seite pflegbar sein.

Code: Alles auswählen

| idfrontendgroupmapping | idfrontendgroup |                    objectguidhex | idclient | 
|                      1 |               1 | 1338d176d884594d886ac22bd5511b76 |        1 | 
Von der Logik her möchte ich im Backend alle Mappings anzeigen, und einen + Button um neue zu erstellen, oder einen edit um vorhandene zu ändern. Dafür sollte der LEFT JOIN dann passen.

Mein Code sieht jetzt so aus:

Code: Alles auswählen

$feGroupMappings = new LDAPGroupMappingCollection();
$feGroupMappings->link('cApiFrontendGroupCollection');
$feGroupMappings->addResultField('objectguidhex');
$feGroupMappings->addResultField('cApiFrontendGroupCollection.groupname');
$feGroupMappings->setWhere('LDAPGroupMappingCollection.idclient', $client);
$feGroupMappings->query();

$fields['idfrontendgroupmapping'] = 'idfrontendgroupmapping';
$fields['idfrontendgroup'] = 'idfrontendgroup';
$fields['objectguidhex'] = 'objectguidhex';
$fields['groupname'] = 'groupname';
$table = $feGroupMappings->fetchTable($fields);
 
foreach ($table as $key => $item) {
    echo "idfrontendgroupmapping: ".$item['idfrontendgroupmapping']."<br>";
    echo "idfrontendgroup: ".$item['idfrontendgroup']."<br>";
    echo "groupname: ".$item['groupname']."<br>";
    echo "objectguidhex: ".$item['objectguidhex']."<br>";
}
Als Ergebnis bekomme ich dann:

Code: Alles auswählen

idfrontendgroupmapping: 1
idfrontendgroup: 1
groupname: Mustergruppe
objectguidhex: 1338d176d884594d886ac22bd5511b76
Damit kann ich jetzt mal anfangen die Backendseite weiter zu bauen.

Ich hoffe das ihr mir weiter helft bis ich das fertig hab.

Danke

Stephan
Dev Umgebung: Contenido Git Develop Branch, Win 10, PHP 7.2.13, VS Code, XDebug, PHP integrated Webserver
Aktuelle arbeite ich am LDAP Plugin für Frontend (und irgendwann Backend) User, Feedback erwünscht!

Faar
Beiträge: 1521
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von Faar » Do 20. Dez 2018, 16:33

https://api.contenido.org/con4911/class-Item.html

Hab erst gesehen, dass eine Seite weiter vorne ja schon die item Klasse benützt wird. :?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

langwebdesign
Beiträge: 73
Registriert: So 23. Okt 2005, 14:11
Wohnort: Titting
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von langwebdesign » Sa 22. Dez 2018, 13:43

Hallo Zusammen,

falls jemand Zeit hat zum Testen, eine erste Version, mit den wichtigsten Features um es einzusetzen, ist fertig.

Der Code liegt hier: https://gitlab.com/stephan14x/auth_ldap/tree/v0.3

Oder direkt als zip download: https://gitlab.com/stephan14x/auth_ldap ... p-v0.3.zip

Die Zip Datei stammt von gitlab und kann wahrscheinlich nicht direkt für den Import im Plugin Manager verwendet werden.

Nachdem sich das hier zum Plugin entwickelt hat, kann vielleicht ein Mod den Thread nach "Module und Plugins" verschieben.

Danke Stephan
Dev Umgebung: Contenido Git Develop Branch, Win 10, PHP 7.2.13, VS Code, XDebug, PHP integrated Webserver
Aktuelle arbeite ich am LDAP Plugin für Frontend (und irgendwann Backend) User, Feedback erwünscht!

Antworten