x

Huvudkapitel

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. Snabbstartsguide - LimeSurvey 3.0+
  3. Installation - LimeSurvey CE
  4. Så utformar du en bra enkät (guide)
  5. Komma igång
  6. Administrera LimeSurvey
  7. Enkäter - introduktion
  8. Enkätinställningar
  9. Enkätmeny
  10. Enkätens struktur
  11. Frågor - introduktion
  12. Frågegrupper - introduktion
  13. Enkäter - hantering
  14. Alternativ i enkätverktygsfältet
  15. Flerspråkig enkät
  16. ExpressionScript-motorn – Snabbstartsguide
  17. Okategoriserade och avancerade funktioner
  18. FAQ
  19. Felsökning
  20. Lösningar och genvägar
  21. Licens
  22. Ändringslogg för versioner
  23. Plugins
 Actions

LDAP-inställningar

From LimeSurvey Manual

Den här sidan kan ha maskinöversatts och kan innehålla fel. Visa det engelska originalet · Förbättra den här översättningen
This page is a translated version of the page LDAP settings and the translation is 100% complete.
  Observera : Den här funktionen gör det möjligt för administratörer av LimeSurvey-enkäter att importera deltagare via LDAP. Om du behöver LDAP-autentisering för administratörer, se AuthLDAP-plugin.


Allmänt

Du måste aktivera LDAP-stöd i config.php och konfigurera LDAP-parametrarna i config/ldap.php för att kunna använda den här funktionen.

  För att kunna använda LDAP måste du kontrollera att LDAP-modulen är installerad i din PHP. Se dokumentationen för PHP:s LDAP-modul för information om hur du installerar tillägget.


Aktivera LDAP i config.php

  • $enableLdap: om du vill använda LDAP-funktioner i LimeSurvey måste du sätta den här parametern till true (standardvärdet är false):
'config'=>array(
		'debug'=>0,
		'debugsql'=>0,
		'enableLdap'=>true,
	)

Definiera LDAP-servrar

Definiera först anslutningsalternativen för LDAP-servern i "application/config/ldap.php". För varje server finns följande alternativ:

  • $serverId: Ett heltal som identifierar LDAP-servern. Det används i sökningsdefinitioner för att koppla en server till en specifik sökning;
  • $ldap_server[$serverId]['server']: LDAP-serverns IP-adress eller DNS-namn. Om du använder SSL-säkrade anslutningar (LDAPs eller LDAP+Start-TLS) måste namnet motsvara serverns certifikat-CN (eller SubjectAlternativeName);
  • $ldap_server[$serverId]['port']: TCP-porten som LDAP-servern lyssnar på. Detta är vanligtvis 389 för LDAP och LDAP+Start-TLS, och 636 för LDAPs;
  • $ldap_server[$serverId]['protoversion']: Kan vara 'ldapv2' eller 'ldapv3' beroende på vilket protokoll din server stöder. 'ldapv3' är det föredragna protokollet. Om du vill använda krypterade anslutningar bör du dock notera att LDAPs stöds i läget 'ldapv2', medan Start-TLS är krypteringsmetoden för 'ldapv3';
  • $ldap_server[$serverId]['encrypt']: Anger vilken krypteringsmetod som används. 'ldaps' stöds för 'ldapv2'-servrar och 'start-tls' för 'ldapv3'-servrar. Nyckelordet 'none' används för LDAP-kommunikation i klartext;
    • Glöm inte att webbservern måste kunna kontrollera LDAP-serverns certifikat vid kryptering med 'ldaps' eller 'start-tls'. Därför måste du definiera din certifikatutfärdare i openldap-biblioteket (vanligtvis görs detta i filen /etc/openldap/ldap.conf under Linux).
  • $ldap_server[$serverId]['referrals']: Det här är en boolesk parameter som anger om referrals ska följas eller inte (använd false för ActiveDirectory);
  • $ldap_server[$serverId]['encoding']: Det här är en valfri parameter som anger vilken teckenkodning LDAP-katalogen använder för att lagra strängar. Du behöver vanligtvis inte ange den här parametern eftersom den antagna standardkodningen, 'utf-8', är standardkodningen för LDAP-kataloger. Om du använder Active Directory och har problem med att importera tecken med accenter kan du dock prova att ange den kodning som används i ditt område (till exempel 'cp850' för Västeuropa). I rullgardinsmenyn "Filens textkodning" i gränssnittet Importera token från CSV-fil hittar du den fullständiga listan över kodningar som stöds.

Därefter måste du definiera vilken autentisering som krävs för att få åtkomst till katalogen. Om 'anonym' åtkomst är tillåten ska du INTE ange de två följande parametrarna, annars anger du dem enligt följande:

  • $ldap_server[$serverId]['binddn']: DN för den 'LDAP'-användare som får läsa katalogen;
  • $ldap_server[$serverId]['bindpw']: Lösenord för ovanstående LDAP-användare.

Om du behöver definiera fler LDAP-servrar lägger du till följande rad för att öka serverID och definiera nya parametrar:

  • $serverId++.

Definiera sökningar i config/ldap.php

Observera: när ett ldap-attributnamn krävs i någon av dessa parametrar ska du endast använda gemener: till exempel displayname och INTE displayName.

Se filen config/ldap.php, som innehåller exempelkonfigurationer.

Enkla sökningar

Vi börjar med enkla sökningar. Dessa sökningar filtrerar bara LDAP-poster utifrån deras egna attribut och plats. De räcker vanligtvis för att söka i ActiveDirectory.

  • $query_id: är id för LDAP-sökningen;
  • $ldap_queries[$query_id]['ldapServerId']: Kopplar sökningen till en specifik server;
  • $ldap_queries[$query_id]['name']: Sträng som beskriver sökningen. Den visas i gränssnittet;
  • $ldap_queries[$query_id]['userbase']: Rot-DN som används för användarsökningar;
  • $ldap_queries[$query_id]['userfilter']: Ett filter som används för att välja ut möjliga användarposter. Det måste omges av parenteser;
  • $ldap_queries[$query_id]['userscope']: omfattning för LDAP-sökningen efter användare ('base', 'one' eller 'sub');
  • $ldap_queries[$query_id]['firstname_attr']: LDAP-attribut som mappas till fältet Förnamn i tokenposten;
  • $ldap_queries[$query_id]['lastname_attr']: LDAP-attribut som mappas till fältet Efternamn i tokenposten;
  • $ldap_queries[$query_id]['email_attr']: LDAP-attribut som mappas till fältet E-postadress i tokenposten.

Du kan också hämta mer information från katalogen:

  • $ldap_queries[$query_id]['token_attr']: LDAP-attribut som mappas till tokenkoden;
  • $ldap_queries[$query_id]['language']: LDAP-attribut som mappas till användarens språkkod;
  • $ldap_queries[$query_id]['attr1']: LDAP-attribut som mappas till fältet attribute_1;
  • $ldap_queries[$query_id]['attr2']: LDAP-attribut som mappas till fältet attribute_2.

Kombinerade gruppsökningar med DN-medlemmar

Nu ska vi se hur du definierar en mer komplicerad sökning.

Följande sökningar använder en första LDAP-sökning som tittar i LDAP-grupper. En LDAP-grupp är en LDAP-post som innehåller referenser till användarposter i form av:

  • användar-id (det gäller till exempel posixGroups) ==> Se nästa avsnitt
  • Eller användar-DN (det gäller till exempel groupofnames och groupofuniquenames) ==> se nedan

Här behandlar vi grupper som innehåller användar-DN:

  • definiera $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] enligt beskrivningen ovan.

Definiera sedan gruppfilterparametrarna:

  • $ldap_queries[$query_id]['groupbase']: Rot-DN där du vill börja söka efter gruppposter;
  • $ldap_queries[$query_id]['groupfilter']: LDAP-filtret som väljer ut möjliga gruppposter;
  • $ldap_queries[$query_id]['groupscope']: Omfattningen av LDAP-sökningen efter grupper ('one', 'base' eller 'sub');
  • $ldap_queries[$query_id]['groupmemberattr']: Namnet på LDAP-attributet i gruppposten som innehåller referenser till användarposter;
  • $ldap_queries[$query_id]['groupmemberisdn']: TRUE.

Nu är allt klart för att den första LDAP-sökningen ska hitta användare som motsvarar de valda grupperna. Du kan dock begränsa vilka av dessa "användarkandidater" som väljs genom att tillämpa ytterligare ett filter på dem. Detta är naturligtvis valfritt:

  • $ldap_queries[$query_id]['userbase']: Bas-DN för LDAP-sökningen efter användare (endast användarkandidater som matchar denna bas väljs);
  • $ldap_queries[$query_id]['userscope']: Omfattning för LDAP-sökningen efter användare (endast användarkandidater som matchar userbase+scope väljs);
  • $ldap_queries[$query_id]['userfilter']: Ett filter som tillämpas på varje användarkandidatpost (på dess attribut) för att lägga till ytterligare ett urval.

Kombinerade gruppsökningar med UID-medlemmar

Nu ska vi se hur du definierar en kombinerad gruppsökning när gruppmedlemmarna är användar-UID och inte användar-DN.

Precis som för gruppsökningar med DN-medlemmar använder dessa sökningar en första LDAP-sökning som letar efter LDAP-gruppposter och hämtar deras medlemmar. Medlemsvärdena används sedan i ett användarsökningsfilter för att söka efter motsvarande poster. Därför måste ytterligare en parameter konfigureras för att ange vilket användarattribut i användarposten som ska matcha det medlems-UID som hittas i grupperna.

Här är de parametrar som krävs:

  • definiera $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] enligt beskrivningen ovan

Definiera sedan gruppfilterparametrarna:

  • $ldap_queries[$query_id]['groupbase']: Rot-DN där du vill börja söka efter gruppposter;
  • $ldap_queries[$query_id]['groupfilter']: LDAP-filtret som väljer ut möjliga gruppposter;
  • $ldap_queries[$query_id]['groupscope']: Omfattningen av LDAP-sökningen efter grupper ('one', 'base' eller 'sub');
  • $ldap_queries[$query_id]['groupmemberattr']: Namnet på LDAP-attributet i gruppposten som innehåller referenser till användarposter;
  • $ldap_queries[$query_id]['groupmemberisdn']: FALSE;
  • $ldap_queries[$query_id]['useridattr']: namnet på det användarattribut som måste matcha det UID som hittas bland gruppmedlemmarna.

Nu är allt klart för att den första LDAP-sökningen ska hitta användar-UID som motsvarar de valda grupperna, och ett användarsökningsfilter fylls i automatiskt.

Du kan dock begränsa vilka av dessa ”användarkandidater” som väljs genom att komplettera det automatiska användarfiltret som beräknas från medlems-UID:n. Detta är naturligtvis valfritt:

  • $ldap_queries[$query_id]['userbase']: Bas-DN för LDAP-sökningen efter användare (endast användarkandidater som matchar denna bas väljs);
  • $ldap_queries[$query_id]['userscope']: Omfång för LDAP-sökningen efter användare (endast användarkandidater som matchar userbase+scope väljs);
  • $ldap_queries[$query_id]['userfilter']: Ett filter som tillämpas på varje användarkandidats post (på dess attribut) för att lägga till ytterligare ett urval.

Hur fungerar det med Active Directory?

Active Directory (AD) är ett register från Microsoft som kan efterfrågas med LDAP-protokollet.

Det är därför möjligt att använda dess innehåll för LimeSurveys token-frågor, men det kräver kunskap om hur AD är organiserat.

  • LDAP-rotbasen är dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1

==> Om ditt företag till exempel äger DNS-domänen 'my-company.com' och din Windows-domän är 'employees', är din rotbas dc=employees,dc=my-company,dc=com

  • Användare och användargrupper lagras under cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (observera att detta inte är ou=users);
  • Active Directory-grupper:
    • Gruppobjekt innehåller medlemmarnas DN i attributet 'member';
    • Gruppmedlemskap lagras även i attributet memberOf i varje användarpost. Detta attribut innehåller DN för de grupper som användaren tillhör;
    • vissa grupper finns i CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
      • Till exempel: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;

I vissa fall är det inte lika enkelt att göra frågor mot en Active Directory, så här är ett exempel på en konfiguration för att hämta viss information från en Active Directory:

//Connection to the active directory Server:
$serverId=0;
$ldap_server[$serverId]['server'] = "10.10.10.10";
$ldap_server[$serverId]['port'] = "389";
$ldap_server[$serverId]['protoversion'] = "ldapv2";
$ldap_server[$serverId]['encrypt'] = "none"; // Most AD LDAP servers will not have encryption set by default
$ldap_server[$serverId]['referrals'] = false;
$ldap_server[$serverId]['binddn'] = "domain\\user";
$ldap_server[$serverId]['bindpw'] = "userpassword";
//$ldap_server[$serverId]['binddn'] = "CN=user,OU=user_group,DC=xxx,DC=yyy"; this one will not work with active directory, that´s why you need to use "domain\\user"
//Here is a sample query for getting all active users of an active directory:
$query_id=0;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Staff with an enabled account';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';
//AD has no "account is enabled" attribute, so the filter excludes accounts that have the "disabled" flag (bit 2) set in userAccountControl
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Leave empty for Auto Token generation by phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';
//You can also filter on group membership through the memberOf attribute of the user. Here is a sample query for getting all active users that are member of the group "samplegroup" in active directory:
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'All members of samplegroup';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(memberOf=CN=samplegroup,OU=Group Global,OU=USER_GROUP,DC=xxx,DC=yyy)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Leave empty for Auto Token generation by phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';

Ett annat exempel på en användarfråga:

$ldap_queries[$query_id]['userfilter'] = '(&(objectCategory=Person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'; // AD doesn't recognise enabled accounts in the normal way, so instead, we check users are not disabled
  • Överväg att lägga till (mail=*) i dina användarfilter för att hoppa över användare utan e-postadress.

Exempel på gruppfråga:

$ldap_queries[$query_id]['groupfilter'] = '(&(objectClass=group)(cn=Domain Admins))'; // AD doesn't use the standard attribute name for groups, so use this example instead.

Skapa en fråga per Active Directory-grupp automatiskt

Om du förvarar grupperna för dina enkätdeltagare i en och samma organisationsenhet (OU) behöver du inte skriva en fråga för varje grupp. Följande kod listar alla grupper i den OU:n och skapar en fråga per grupp. Frågan omfattar alla aktiva medlemmar i gruppen, inklusive medlemmar i kapslade grupper.

Lägg till koden i config/ldap.php efter dina server- och frågedefinitioner och före raden //DO NOT CHANGE BELOW HERE. Ange sedan de fyra variablerna högst upp:

  • $groupServerId: $serverId för den server som ska användas;
  • $groupContainer: DN för den OU som innehåller grupperna. Endast grupper direkt i denna OU listas, inte grupper i underliggande OU:er;
  • $groupUserBase: rot-DN under vilken gruppmedlemmarna söks;
  • $groupNameAttr: det gruppattribut (med gemener) som används som frågans namn i det grafiska gränssnittet, till exempel 'info' (fältet ”Notes” i ”Active Directory Users and Computers”) eller 'description'. Om en grupp saknar värde i detta attribut används dess cn.
$groupServerId  = 0;
$groupContainer = 'OU=Survey groups,DC=xxx,DC=yyy';
$groupUserBase  = 'DC=xxx,DC=yyy';
$groupNameAttr  = 'info';

$srv = $ldap_server[$groupServerId];
$ds = ldap_connect(($srv['encrypt'] == 'ldaps' ? 'ldaps://' : 'ldap://') . $srv['server'] . ':' . $srv['port']);
if ($ds) {
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, $srv['protoversion'] == 'ldapv3' ? 3 : 2);
    ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
    // Never send the bind password if Start-TLS was requested but failed
    $secure = $srv['encrypt'] != 'start-tls' || @ldap_start_tls($ds);
    $bound = $secure && (empty($srv['binddn']) ? @ldap_bind($ds) : @ldap_bind($ds, $srv['binddn'], $srv['bindpw']));
    $result = $bound ? @ldap_list($ds, $groupContainer, '(objectCategory=group)', array('cn', $groupNameAttr)) : false;
    $groups = $result ? ldap_get_entries($ds, $result) : array('count' => 0);
    for ($i = 0; $i < $groups['count']; $i++) {
        $query_id++;
        $ldap_queries[$query_id]['ldapServerId'] = $groupServerId;
        $ldap_queries[$query_id]['name'] = isset($groups[$i][$groupNameAttr][0]) ? $groups[$i][$groupNameAttr][0] : $groups[$i]['cn'][0];
        $ldap_queries[$query_id]['userbase'] = $groupUserBase;
        // Enabled users with an email address that are members of the group, directly or through nested groups
        $ldap_queries[$query_id]['userfilter'] = '(&(objectCategory=person)(objectClass=user)(mail=*)'
            . '(!(userAccountControl:1.2.840.113556.1.4.803:=2))'
            . '(memberOf:1.2.840.113556.1.4.1941:=' . ldap_escape($groups[$i]['dn'], '', LDAP_ESCAPE_FILTER) . '))';
        $ldap_queries[$query_id]['userscope'] = 'sub';
        $ldap_queries[$query_id]['firstname_attr'] = 'givenname';
        $ldap_queries[$query_id]['lastname_attr'] = 'sn';
        $ldap_queries[$query_id]['email_attr'] = 'mail';
        $ldap_queries[$query_id]['token_attr'] = '';
        $ldap_queries[$query_id]['language'] = '';
        $ldap_queries[$query_id]['attr1'] = '';
        $ldap_queries[$query_id]['attr2'] = '';
    }
    ldap_unbind($ds);
}

Saker att tänka på:

  • Koden ansluter till katalogen varje gång sidan ”Importera deltagare från LDAP” öppnas eller skickas, så nya grupper dyker upp utan att konfigurationen behöver ändras. Om anslutningen eller bindningen misslyckas visar sidan endast de frågor som du har definierat manuellt.
  • Matchningsregeln 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) löser upp kapslade grupper. Den finns endast i Active Directory, så det här exemplet fungerar inte med andra LDAP-servrar. På dessa kan du i stället använda en kombinerad gruppfråga för varje grupp.
  • Om du även vill lista grupper i underliggande OU:er till $groupContainer ersätter du ldap_list med ldap_search.
  • Om du vill lista grupper från mer än en OU upprepar du koden med andra värden för de fyra variablerna.

Mer information om LDAP-strukturen i Active Directory finns i Active Directory Architecture och Active Directory Technical Specification.