只有当用户拥有某个组时,Zend Ldap才允许

时间:2011-09-30 08:40:26

标签: authentication zend-framework ldap

我想要实现的目标:

  • 有两个不同的小组
  • 施用
  • 只读

我希望能够对用户进行身份验证并根据他所属的群组分配角色。

我尝试了什么:

鉴于官方文档,我已经设置了两个具有不同组选项的“服务器”进行身份验证:

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"

现在官方文档说,如果针对第一台服务器的身份验证失败,它将尝试针对第二台服务器执行此操作。但是,我的身份验证脚本似乎并非如此。

我有三个测试帐户,一个没有组,两个每个都有。如果我只使用其中一个选项,它对用户应该有效,所有其他选项都被拒绝,就像我想要的那样。

但我似乎无法实施“流体检查”。

此外:即使“流体检查”有效,我也不明白我将如何找出,用户能够对哪个群组进行身份验证。

根据我的理解,在获得正面身份验证以读取用户组后,我需要手动查询服务器 - 这是正确的吗?如果是这样,我在此网站上发现了以下问题:Query all groups of a user using Zend_Ldap 然而,这似乎对我没有用,因为我只得到空数组或错误,这取决于我尝试的内容:(

1 个答案:

答案 0 :(得分:2)

  现在官方文档说,如果认证反对   第一个服务器失败,它将尝试对第二个服务器执行此操作。   但是,我的身份验证似乎并非如此   脚本。

您描述的行为是作为错误ZF-409的解决方案引入的。为了使它能够工作,只需在2个LDAP服务器选项中设置不同的accountDomainName(或accountDomainNameShort):

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 值以及提供的用户名