2011-09-30 30 views
2

我想达到的目标: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 但似乎不是为我工作,因为我只得到空数组或错误,这取决于我尝试:(

+0

我现在能够以一种非常丑陋的方式解决这个问题..我首先检查管理组,如果我得到错误的组认证失败,我实例化一个全新的身份验证实例和查询反对只读组... 然而,这是超级丑陋的,使它与超过两个组合使用会导致一个非常非常非常丑陋的代码 - 只需通过身份验证适配器就可以对ldap进行身份验证,以找出用户身份验证的组反对:S – Sam

回答

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值。