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;
}
}
- 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
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