Zend Ldap разрешить, только если у пользователя есть определенная группа - PullRequest
2 голосов
/ 30 сентября 2011

Чего я хочу достичь:

  • есть две разные группы
  • Администрация
  • 1008 * только для чтения *

Я хочу иметь возможность аутентифицировать пользователя и назначать роль в зависимости от того, к какой группе он принадлежит.

Что я пробовал:

Учитывая официальные документы, я установил два "сервера" с различными опциями группы для аутентификации:

ldap.admin.host = myhost
ldap.admin.port = myport
ldap.admin.useStartTls = true
ldap.admin.useSsl = true
ldap.admin.username = "cn=ama,ou=LDAPAuth,dc=mydc,dc=de"
ldap.admin.password = "mypass"
ldap.admin.accountFilterFormat = "cn=%s"
ldap.admin.baseDn = "dc=mydc,dc=de"
ldap.admin.bindRequiresDn = true
ldap.admin.group = "ama"
ldap.admin.groupDn = "cn=ama,ou=groups,dc=mydc,dc=de"
ldap.admin.groupAttr = "cn"
ldap.admin.groupFilter = "objectClass=groupOfNames"
ldap.admin.memberAttr = "member"

ldap.readonly.host = myhost
ldap.readonly.port = myport
ldap.readonly.useStartTls = true
ldap.readonly.useSsl = true
ldap.readonly.username = "cn=ama,ou=LDAPAuth,dc=mydc,dc=de"
ldap.readonly.password = "mypass"
ldap.readonly.accountFilterFormat = "cn=%s"
ldap.readonly.baseDn = "dc=mydc,dc=de"
ldap.readonly.bindRequiresDn = true
ldap.readonly.group = "ama_ro"
ldap.readonly.groupDn = "cn=ama_ro,ou=groups,dc=mydc,dc=de"
ldap.readonly.groupAttr = "cn"
ldap.readonly.groupFilter = "objectClass=groupOfNames"
ldap.readonly.memberAttr = "member"

Теперь официальные документы говорят, что если аутентификация на первом сервере не удалась, он попытается сделать это на втором. Однако, похоже, что это не так с моим скриптом аутентификации.

Я получил три тестовых аккаунта, один без группы, по два с каждым из них. Если я использую только один из вариантов, он работает для пользователя, он должен, все остальные получают доступ, как я хочу.

Но я просто не могу реализовать "проверку текучести".

Более того: даже если «жидкая проверка» сработает, я не совсем понимаю, как бы я узнал, с какой группой пользователь мог аутентифицироваться.

Насколько я понимаю, мне нужно было бы вручную выполнить запрос к серверу после получения положительной аутентификации для чтения групп пользователя - это правильно? Если это так, я нашел следующий вопрос здесь на этом сайте: Запрос всех групп пользователя с помощью Zend_Ldap Это, однако, не работает для меня, потому что я получаю только пустые массивы или ошибки, в зависимости от того, что я пытаюсь: (

1 Ответ

2 голосов
/ 01 марта 2013

Теперь официальные документы говорят, что если аутентификация на первом сервере не пройдена, он попытается сделать это на втором.Однако, похоже, что это не так с моим скриптом аутентификации.

Поведение, которое вы описываете, было введено как решение для ошибки ZF-409 .Чтобы заставить его работать так, как вы хотите, просто задайте другое значение accountDomainName (или accountDomainNameShort) в параметрах вашего 2 сервера LDAP:

ldap.admin.accountDomainName      = admin.domain
ldap.admin.accountDomainNameShort = admin

ldap.readonly.accountDomainName      = readonly.domain
ldap.readonly.accountDomainNameShort = readonly

Если вы входите в систему с использованием действительного пользователя «только для чтения», он не сможет войти в системув качестве администратора, но он войдет в систему только для чтения.Zend_Auth_Result будет выглядеть примерно так:

object(Zend_Auth_Result)#159 (3) {
  ["_code":protected] => int(1)
  ["_identity":protected] => string(26) "readonly\username"
  ["_messages":protected] => array(6) {
    [0] => string(0) ""
    [1] => string(0) ""
    [2] => string(312) "host=host,useSsl=1,accountDomainName=admin.domain,accountDomainNameShort=admin,accountCanonicalForm=3,baseDn=dc=mydc,dc=de,bindRequiresDn=1,useStartTls=1,group=ama_ro,groupDn=cn=ama_ro,ou=groups,dc=mydc,dc=de,groupAttr=cn,groupFilter=objectClass=groupOfNames,memberAttr=member"
    [3] => string(142) "Failed to verify group membership with (&(&(cn=admin)(member=youruserDN))(yourfilter))"
    [4] => string(310) "host=host,useSsl=1,accountDomainName=readonly.domain,accountDomainNameShort=readonly,accountCanonicalForm=3,baseDn=dc=mydc,dc=de,bindRequiresDn=1,useStartTls=1,group=ama_ro,groupDn=cn=ama_ro,ou=groups,dc=mydc,dc=de,groupAttr=cn,groupFilter=objectClass=groupOfNames,memberAttr=member"
    [5] => string(52) "readonly\username authentication successful"
  }
}

После того, как вы получите $login->isValid(), просто выполните $login->getIdentity(), и вы получите значение accountDomainNameShort вместе с username предоставляется.

...