只有当用户拥有某个组时,Zend Ldap才允许
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只有当用户拥有某个组时,Zend 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然而这对我来说似乎不起作用,因为我只得到空数组或错误,取决于我尝试:(
现在官方文档说,如果针对第一台服务器的身份验证失败,它将尝试针对第二台服务器执行此操作。但是,我的身份验证脚本似乎不是这种情况。
您描述的行为是作为bug 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值以及提供的用户名。
以上是关于只有当用户拥有某个组时,Zend Ldap才允许的主要内容,如果未能解决你的问题,请参考以下文章
DjangoRestFramework - 只有当 request.user 正在查看他自己的用户对象时才可能允许某些请求?
仅当找到第 1 组时,来自两个组的 Redshift SQL 汇总量