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

问题描述 投票:2回答:1

我想要实现的目标:

  • 有两个不同的组
  • 管理
  • 只读

我希望能够验证用户并根据他所属的组分配角色。

我尝试过的:

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

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然而这对我来说似乎不起作用,因为我只得到空数组或错误,取决于我尝试:(

authentication zend-framework ldap
1个回答
2
投票

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

您描述的行为是作为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值以及提供的用户名。

© www.soinside.com 2019 - 2024. All rights reserved.