我想要实现的目标:
我希望能够对用户进行身份验证并根据他所属的群组分配角色。
我尝试了什么:
鉴于官方文档,我已经设置了两个具有不同组选项的“服务器”进行身份验证:
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 然而,这似乎对我没有用,因为我只得到空数组或错误,这取决于我尝试的内容:(
答案 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 值以及提供的用户名。