LDAP Authentifizierung

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

LDAP Authentifizierung

Beitrag von langwebdesign » Do 6. Dez 2018, 22:42

Hallo Zusammen,

nachdem ich nirgends eine LDAP Authentifizierung für Frontend User finden konnte, habe ich mich selbst dran gemacht.

Hier ein erster Entwurf, ich habe dazu einfach die validateCredentials() in contenido/classes/auth/class.auth.handler.frontend.php editiert.

Code: Alles auswählen

    public function validateCredentials() {

        $client = cRegistry::getClientId();
        $serverFQDN = getEffectiveSetting('ldap', 'serverFQDN', "domaincontroller.domain.local");
        $userDomain = getEffectiveSetting('ldap', 'userDomain', "domain");
        $userSearchPath = getEffectiveSetting('ldap', 'userSearchPath', "dc=domain,dc=local");
        
        $adServer = "ldap://".$serverFQDN;
        $ldap = ldap_connect($adServer);
        $username = conHtmlentities(stripslashes(trim($_POST['username'])));
        $password = $_POST['password'];
        $ldaprdn = $userDomain."\\". $username;

        ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
        ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);

        $bind = @ldap_bind($ldap, $ldaprdn, $password);
    
        if ($bind) {
            $filter="(sAMAccountName=".$username.")";
            $result = ldap_search($ldap, $userSearchPath, $filter);

            ldap_sort($ldap,$result,"sn");
            $info = ldap_get_entries($ldap, $result);
            for ($i=0; $i<$info["count"]; $i++)
            {
                if($info['count'] > 1){
                    return false;    
                }
                $userDn = $info[$i]["distinguishedname"][0];
                $lastname = $info[$i]["sn"][0];
                $firstname = $info[$i]["givenname"][0];
                $memberof = $info[$i]["memberof"];
            }
            @ldap_close($ldap);
        
            // create user on logon
            // find user if exists
            $feUser = new cApiFrontendUser($idfrontenduser);
            $frontendUserColl = new cApiFrontendUserCollection();
            $frontendUserColl->select("idclient = ".$client." AND username = '".$username."'");

            if($frontenduser = $frontendUserColl->next()) {
                $idfrontenduser = $frontenduser->get("idfrontenduser");
                // remove user from all groups, see con_frontendgroupmembers
                $feUser->loadByPrimaryKey($idfrontenduser);
                if ($feUser->isLoaded() === true) {
                    $feGroups = $feUser->getGroupsForUser();
                    if(count($feGroups)>0){
                        $groupmembers = new cApiFrontendGroupMemberCollection();
                        foreach ($feGroups as $idfrontendgroup) {
                            $groupmembers->remove($idfrontendgroup, $idfrontenduser);
                        }
                    }
                }
            } else {
                // create user
                $feusers = new cApiFrontendUserCollection();
                $feUser = $feusers->create($username);
            }
            
            // add user to groups based on AD group memberships
            //convert from DN to plain groupname
            array_walk($memberof,
                function (&$item, $key) {
                    $parts = explode(",", $item);
                    $item = substr($parts[0], 3);
                }
            );
            // get all contenido groups
            $feGroupsCol = new cApiFrontendGroupCollection();
            $feGroupsCol->select("idclient = ".$client, "", "groupname ASC");
            
            // match groups
            while (($fegroup = $feGroupsCol->next()) !== false) {
                $groupname = $fegroup->get("groupname");
                $idfegroup = $fegroup->get("idfrontendgroup");
                $key = array_search($groupname, $memberof);
                // add user to contenido group
                if($key)
                {
                    $groupmembers = new cApiFrontendGroupMemberCollection();
                    $groupmembers->create($idfegroup, $idfrontenduser);
                }
            }
      
            // ldap user only for frontend access
            $this->auth['perm'] = "frontend";
            return $idfrontenduser;
        }else {
            return false;    
        }
    }
Die Funktionsweiße kurz beschrieben:
  • Benutzer und Passwort werden per LDAP geprüft - ldap_bind()
  • Benutzerdetails und Gruppenmitgliedschaften werden geladen
  • Sollte der Benutzer aus LDAP im Contenido vorhanden sein werden die Contenido Gruppenmitgliedschaften entfernt
  • Fehlende Benutzer werden angelegt
  • Die Contenido Gruppen werden mit den LDAP Gruppen verglichen, bei Übereinstimmung wird der Benutzer zur Contenido Gruppe hinzugefügt
  • Die Contenido Gruppen müssen dazu manuell mit dem gleichen Gruppennamen angelegt und Berechtigungen zugewiesen werden
  • Es muss nichts weiter an Contenido angepasst werden
  • Manuell angelegte Frontend User funktionieren nicht mehr
Das Updaten der Gruppenmitgliedschaften könnte nur alle X Tage durchgeführt werden, indem man z.B. das Benutzerfeld valid_to setzt und auswerted.

Eleganter wäre es natürlich eine eigene Klasse zu schreiben und zu registrieren um bei Updates keine Probleme zu bekommen.
Wenn jemand Ahnung hat wie man das hinbekommt, bin ich offen für Vorschläge.

Außerdem würde ich beim Benutzer gern noch ein paar infos aus LDAP ins Contenido speichern, Name, Abteilung usw.
Wie würdet ihr das machen ohne am core rumzuspielen, oder kann ich die frontendusers Tabelle einfach erweitern ohne Probleme zu bekommen?

Feedback und Verbesserungen erwünscht.
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!

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von emergence » Fr 7. Dez 2018, 15:57

hmm...

du könntest um zusätzliche infos zu speichern die properties verwenden... so wie es die frontenduser plugins machen...
dann brauchst du die tabelle nicht modifizieren...
*** make your own tools (wishlist :: thx)

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

Re: LDAP Authentifizierung

Beitrag von Faar » Fr 7. Dez 2018, 16:29

langwebdesign hat geschrieben:
Do 6. Dez 2018, 22:42
Eleganter wäre es natürlich eine eigene Klasse zu schreiben und zu registrieren um bei Updates keine Probleme zu bekommen.
Wenn jemand Ahnung hat wie man das hinbekommt, bin ich offen für Vorschläge.
Ich bin kein OOP-Spezialist, aber...
Du kannst die Klasse kopieren, deine Änderungen rein setzen und als cMyAuthHandlerFrontend bezeichnen.
Dann speicherst Du sie vielleicht im Frontendbereich und bindest sie im Modul mit cInlcude() ein.
Es könnte dann zu Konflikten kommen, weil zweimal Objekte gleichen Namens vorhanden wären.
Das weiß ich jetzt nicht genau, ob das ginge.

Oder schreibst eigene Methoden (Funktionen) in eine eigene Klasse und erweiterst die Klasse:

Code: Alles auswählen

class cMyAuthHandlerFrontend extends cAuthHandlerFrontend { 
public function DinGens() { 
   do your code 
} 
}
Diese eigenen Funktionen können auf Inhalte und Funktionen der Contenido Klasse zugreifen. Das bietet einige Möglichkeiten.
Außerdem würde ich beim Benutzer gern noch ein paar infos aus LDAP ins Contenido speichern, Name, Abteilung usw.
Wie würdet ihr das machen ohne am core rumzuspielen, oder kann ich die frontendusers Tabelle einfach erweitern ohne Probleme zu bekommen?
Die Frontenduser-Tabelle ist relativ harmlos aber statt die original Tabelle zu ändern, habe ich es so gemacht, dass ich die UserID nahm und diese als Referenz in eine neue Tabelle übernommen habe und dort dann meine eigenen Daten hinein geschrieben.
Dann kann man da einfach mit SQL auswählen: SELECT * FROM table WHERE userid='3'
Natürlich muss irgendein Modul dafür sorgen, dass Contenido UserID mit der in der eigenen Tabelle überein stimmt.
Das ist schon einiges mehr an Programmierung darum herum als es hier vereinfacht dargestellt wird.
Vermutlich wirst Du dich auch hiermit rumschlagen müssen: https://api.contenido.org/latest/class- ... ction.html
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

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

Re: LDAP Authentifizierung

Beitrag von langwebdesign » Fr 7. Dez 2018, 16:47

emergence hat geschrieben:
Fr 7. Dez 2018, 15:57
du könntest um zusätzliche infos zu speichern die properties verwenden... so wie es die frontenduser plugins machen...
Welche Plugins meinst du?
Kannst du da einen link posten?
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: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von xmurrix » Fr 7. Dez 2018, 16:52

Faar hat geschrieben:
Fr 7. Dez 2018, 16:29
...Oder schreibst eigene Methoden (Funktionen) in eine eigene Klasse und erweiterst die Klasse:

Code: Alles auswählen

class cMyAuthHandlerFrontend extends cAuthHandlerFrontend { 
public function DinGens() { 
   do your code 
} 
}
...
Das mit der eigenen Klasse ist eine sehr gute Idee, wir bräuchten noch in CONTENIDO eine Möglichkeit, auch die eigene Klasse anstatt die vordefinierte zu verwenden. Überall, wo die Anwendung, die Session, die Authentifizierung und die Berechtigungen initialisiert, müsste dann die eigene Klasse angegeben werden.

Also anstatt

Code: Alles auswählen

    cRegistry::bootstrap(array(
        'sess' => 'cFrontendSession',
        'auth' => 'cAuthHandlerFrontend',
        'perm' => 'cPermission'
    ));
folgendermaßen

Code: Alles auswählen

    cRegistry::bootstrap(array(
        'sess' => $cfg['bootstrap']['sess_class_name'],
        'auth' => $cfg['bootstrap']['auth_class_name'],
        'perm' => $cfg['bootstrap']['perm_class_name']
    ));
Dann bräuchten wir neue Konfigurationen, in der man die Namen der zu verwendenden Klassen definiert

Code: Alles auswählen

$cfg['bootstrap']['sess_class_name'] = 'cFrontendSession';
$cfg['bootstrap']['auth_class_name'] = 'cAuthHandlerFrontend';
$cfg['bootstrap']['perm_class_name'] = 'cPermission';
Zwei Sachen sind hier zu berücksichtigen. Wenn man seine eigenen Klassen dafür implementiert, muss man sich sehr sicher sein, was man da macht, denn man ersetzt hierbei den Schutzmechanismus des Systems gegen einen eigenen. Ist der nicht sicher genug, kann es fatale Folgen haben.
Das andere wäre die Bereitstellung der Klasses. Das System bekommt nur die Klassennamen, d. h. es weis nicht, woher es die dazu nötige Klassen-Dateien laden soll. Die Dateien der eigenen Klassen müssten im CONTENIDO Autoloader-Mechanismus registriert werden, damit sie gefunden werden können.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

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

Re: LDAP Authentifizierung

Beitrag von langwebdesign » Fr 7. Dez 2018, 16:59

Kann ich den autoloader dazu bringen meine statt der original Datei zu laden
Doku habe ich was für die 4.8 gefunden

https://docs.contenido.org/plugins/serv ... ew/3014874

aber damit muss ich mich erst beschäftigen
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: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von xmurrix » Fr 7. Dez 2018, 17:20

...Kann ich den autoloader dazu bringen meine statt der original Datei zu laden...
Ja, du brauchst eine Benutzerdefinierte Autoloader-Datei config.autoloader.local.php in data/config/{environment}/ hinterlegen, in der der Pfad zur deiner Klasse drin steht.

Code: Alles auswählen

<?php
return array(
    'cFrontendSession' => 'contenido/classes/class.session.php', // 'contenido/classes/class.session.php' gegen eigenen Pfad ersetzen!
);
Wichtig ist, dass die Datei innerhalb des contenido-Ordners liegen muss, das kann z. B. in ein Plugin sein.

Wenn du das so machst, kannst du auch den gleichen Klassennamen "cFrontendSession" verwenden, dann braucht man die ganze Konfiguration der Klassennamen, wie zuvor erwähnt, nicht.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von emergence » Fr 7. Dez 2018, 19:34

langwebdesign hat geschrieben:
Fr 7. Dez 2018, 16:47
emergence hat geschrieben:
Fr 7. Dez 2018, 15:57
du könntest um zusätzliche infos zu speichern die properties verwenden... so wie es die frontenduser plugins machen...
Welche Plugins meinst du?
Kannst du da einen link posten?
hier zb eine beschreibung
https://docs.contenido.org/display/COND ... ntendusers
*** make your own tools (wishlist :: thx)

Oldperl
Beiträge: 4250
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von Oldperl » Sa 8. Dez 2018, 13:32

Servus,

einfach deine eigene Klasse gleichen Namens per Plugin einbinden. Im Plugin kann man ebenfalls den Autoloader ebenfalls nutzen, wobei Klassen gleichen Namens Core-Klassen ersetzen können. Sollte zwar aus Sicherheitsgründen eigentlich nicht gehen, geht aber bei Contenido.
Nur im Backend geht das nicht mit den Auth-, Session- und Perm-Klassen, zumindest nicht vor dem Login, da dort die Plugins erst nach dem Login geladen werden, im Frontend sollte es aber problemlos funktionieren.

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

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

Re: LDAP Authentifizierung

Beitrag von langwebdesign » Sa 8. Dez 2018, 17:35

Hallo,
xmurrix hat geschrieben:
Fr 7. Dez 2018, 17:20
Ja, du brauchst eine Benutzerdefinierte Autoloader-Datei config.autoloader.local.php in data/config/{environment}/ hinterlegen, in der der Pfad zur deiner Klasse drin steht.
Das hat super funktioniert, Danke.

Code: Alles auswählen

<?php
return array(
    'cAuthHandlerFrontend' => 'contenido/plugins/frontend_ldap/classes/class.auth.handler.frontend.ldap.php'
);
?>
Die Idee mit dem Plugin von Ortwin gefällt mir noch besser, hab das mit diesem code in der config.plugin.php versucht (aus AMR kopiert...):

Code: Alles auswählen

$pluginClassPath = 'contenido/plugins/frontend_ldap/classes/';
cAutoload::addClassmapConfig(array(
    'cAuthHandlerFrontend' => $pluginClassPath.'class.auth.handler.frontend.ldap.php'
));
unset($pluginClassPath);
Aber damit lassen sich die Core Klassen anscheinend nicht überschreiben.
Siehe auch den Kommentar am Ende der Docu unter https://docs.contenido.org/display/CONDEVE/cAutoload

Kann ich die config.autoloader.local.php irgendwie mit meinem Plugin ausliefern und installieren lassen?

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: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von xmurrix » So 9. Dez 2018, 10:44

Hallo langwebdesign,
langwebdesign hat geschrieben:
Sa 8. Dez 2018, 17:35
...Aber damit lassen sich die Core Klassen anscheinend nicht überschreiben.
Siehe auch den Kommentar am Ende der Docu unter https://docs.contenido.org/display/CONDEVE/cAutoload ...
man kann in Plugins zwar alle Core-Dateien überschreiben, wenn man aber vor hat, dies zur Laufzeit zu machen, ist das für viele Core-Dateien zu spät, da Plugins nach dem Initialisieren des CMS ausgefüht werden. Idealerweise erreicht man das, in dem man seine Klassen in der config.autoloader.local.php setzt, diese Konfiguration greift von Anfang an, also auch während der Initialisierung des CMS.
langwebdesign hat geschrieben:
Sa 8. Dez 2018, 17:35
...Kann ich die config.autoloader.local.php irgendwie mit meinem Plugin ausliefern und installieren lassen?...
Das Plugin-System bietet momentan keine Schnittstelle, über die man bei der Installation benutzerdefinierte Funktionen ausführen kann.

Falls die config.plugin.php schon während des Installationsprozesses eingebunden wird, könntest du deine Funktion darin integrieren, also deine Änderungen an der Datei "config.autoloader.local.php" machen, wenn das Plugin gerade installiert wird. Zum einen hast du aber das Problem, PHP-Code zu generieren oder vorhandenen PHP-Code zu ändern, zum anderen ist die config.plugin.php eigentlich nur dafür gedacht, die Konfiguration des Plugins oder Systems zu setzen.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Oldperl
Beiträge: 4250
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von Oldperl » So 9. Dez 2018, 19:44

Servus,

ja stimmt, die Core-Klassen im bootstrap können nur in den lokalen Konfigurationsdateien überschrieben werden, und das sowohl im Front- als auch im Backend. Der Aufruf und die Initialisierung erfolgt bereits vor der Einbindung von Plugins, so wie das auch sein sollte, um ein Hacken per Plugin zu vermeiden.

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

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

Re: LDAP Authentifizierung

Beitrag von langwebdesign » Di 18. Dez 2018, 23:49

Hallo,

bräuchte wieder eure Hilfe.

Bastl gerade am Plugin und hab eine eigene Tabelle mit der entsprechenden Klasse dazu erstellt.
aus plugin_install.sql

Code: Alles auswählen

CREATE TABLE IF NOT EXISTS `!PREFIX!_ldap_frontendgroupmapping` (`idfrontendgroupmapping` INT(10) NOT NULL AUTO_INCREMENT, `idfrontendgroup` INT(10) NOT NULL DEFAULT '0', `objectguidhex` VARCHAR(255) NOT NULL, `idclient` INT(10) NOT NULL DEFAULT '0', PRIMARY KEY (`idfrontendgroupmapping`));
Aus class.authldap.groupmapping.php

Code: Alles auswählen

<?php
 
class LDAPGroupMappingCollection extends ItemCollection {
    public function __construct() {
        global $cfg;
        parent::__construct($cfg['sql']['sqlprefix'] . "_pi_ldap_frontendgroupmapping", 'frontendgroupmapping');
        $this->_setItemClass('LDAPGroupMapping');
        $this->_setJoinPartner('cApiFrontendGroupCollection');
    }

    public function newGroupMapping($idfrontendgroup, $objectguidhex, $idclient) {
        $item = parent::createNewItem();
        $item->set("idfrontendgroup", $idfrontendgroup);
        $item->set("objectguidhex", $objectguidhex);
        $item->set("idclient", $idclient);
        return $item->store();
    }
}

class LDAPGroupMapping extends Item {
    public function __construct($mId = false) {
        global $cfg;
        parent::__construct($cfg['sql']['sqlprefix'] . "_pi_ldap_frontendgroupmapping", 'frontendgroupmapping');
        $this->setFilters(array(
            'addslashes'
        ), array(
            'stripslashes'
        ));
        if ($mId !== false) {
            $this->loadByPrimaryKey($mId);
        }
    }
}
Über diese Tabelle ordne ich LDAP Gruppen den Contenido Gruppen zu. In idfrontendgroup ist die ID aus !PREFIX!_frontendgroups.
Jetzt würde ich gern die Daten per Join holen, aber dafür die Collections verwenden statt direkt per SQL auf die DB zu gehen.

Entsprechend habe ich in class.authldap.groupmapping.php

Code: Alles auswählen

$this->_setJoinPartner('cApiFrontendGroupCollection');
gesetzt.

Wenn ich so Daten abrufe bekommen ich auch welche angezeigt:

Code: Alles auswählen

$feGroupMappings = new LDAPGroupMappingCollection();
$feGroupMappings->select("idclient = ".$client);
while (($feGroupMapping = $feGroupMappings->next()) !== false) {
    echo "ID Frontend Group: ".$feGroupMapping->get("idfrontendgroup");
    echo "<br>";
    echo "LDAP Object GUID as Hex: ".$feGroupMapping->get("objectguidhex");
    echo "<br><br>";
}
Wenn ich das mit dem Join so versuche bekomme ich einfach keinen Wert für groupname:

Code: Alles auswählen

$feGroupMappings = new LDAPGroupMappingCollection();
$feGroupMappings->link('cApiFrontendGroupCollection');
$feGroupMappings->addResultField('cApiFrontendGroupCollection.groupname');
$feGroupMappings->select("idclient = ".$client);
while (($feGroupMapping = $feGroupMappings->next()) !== false) {
    echo "ID Frontend Group: ".$feGroupMapping->get("idfrontendgroup");
    echo "<br>";
    echo "Frontend Group Name: ".$feGroupMapping->get("cApiFrontendGroupCollection.groupname");
    echo "<br>";
    echo "LDAP Object GUID as Hex: ".$feGroupMapping->get("objectguidhex");echo "<br><br>";
}
Sobald ich das $feGroupMappings->select("idclient = ".$client); durch $feGroupMappings->query() ersetze bekomme ich gar nichts mehr, auch wenn ich nur die Collection abfrage:

Code: Alles auswählen

$feGroupMappings = new LDAPGroupMappingCollection();
$feGroupMappings->setWhere('idclient', $client);
$feGroupMappings->query();
echo $feGroupMappings->count(); // immer 0
Hier auch, nichts:

Code: Alles auswählen

$feGroupMappings = new LDAPGroupMappingCollection();
$feGroupMappings->link('cApiFrontendGroupCollection');
$feGroupMappings->addResultField('cApiFrontendGroupCollection.groupname');
$feGroupMappings->setWhere('idclient', $client);
$feGroupMappings->query();
echo $feGroupMappings->count(); // immer 0
Der Rest vom Code liegt hier: https://gitlab.com/stephan14x/auth_ldap

was mache ich hier falsch?

So als Info, mache das mit dem develop branch vom Contenido git und php 7.2.13
Habt ihr irgendwelche Tipps wie ich meine Dev Umgebung aufbauen soll, mach das aktuell mit dem php integrated webserver.
Kann z.B: ich irgendwo ein debug mode einschalten?

Danke Stephan

@edit in den letzten zwei Codeblocks war ein Fehler, jeweils in der letzten Zeile, ändert aber nichts dran das es nicht geht.
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: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: LDAP Authentifizierung

Beitrag von xmurrix » Mi 19. Dez 2018, 09:44

Hallo langwebdesign,

wenn man mit Join-Partner Klassen arbeitet, hier wird 'cApiFrontendGroupCollection' als Join-Partner zu 'LDAPGroupMappingCollection' definiert, muss man sich im Klaren sein, dass die Verwendung der select() Methode dies nicht berücksichtigt. Das war noch nie mittels select() möglich, select() geht immer direkt auf die Tabelle, die in der Klasse definiert ist, auch ignoriert select() zuvor gesetzte setWhere()- oder setWhereGroup()-Angaben. Das, was du hier brauchst, ist die query() Methode.

Probiere folgendes aus:

Code: Alles auswählen

$feGroupMappings = new LDAPGroupMappingCollection();
$feGroupMappings->link('cApiFrontendGroupCollection');
$feGroupMappings->setWhere('capifrontendgroupcollection.idclient', $client);
$feGroupMappings->query();
Das sollte so funktionieren, aber ganz sicher bin ich mir nicht, da ich ungerne mit Join-Partnern arbeite.

Was das debuggen angeht, das sollte auch mit dem built-in Webserver funktionieren, du muss halt deine IDE so konfigurieren, dass du deine PHP Scripte debuggen kannst.

Für PhpStorm ist das auf folgender Seite beschrieben:
https://www.jetbrains.com/help/phpstorm ... gging.html

Für Visual Studio Code gibt es folgende Erweiterung:
https://marketplace.visualstudio.com/it ... .php-debug

Ohne eine IDE, ist das Debuggen nur auf die alte Art möglich, also entweder Werte mit echo ausgeben oder in eine Log-Datei schreiben.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

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

Re: LDAP Authentifizierung

Beitrag von langwebdesign » Mi 19. Dez 2018, 12:33

Hallo xmurrix,

danke für deine schnelle Antwort.

Ich hab jetzt mal versucht den Join mit einer der cApi Klassen zu machen und bekomme es trotzdem nicht hin.

Die query() Methode funktioniert bei meiner Klasse überhaupt nicht, auch ohne Join nicht, wenn ich das gleiche mit einer der cApi Klassen mache funktioniert es. Da muss ich meine Klasse mal mit den cApi vergleichen...

Wie machst du das dann?

OK arbeite mit VScode, das sehe ich mir mal an.

Danke
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