我正在尝试将 ACL 权限存储到 LDAP。我有用户和组的权限(用户属于多个组)。这是我创建的结构:
ou=Groups
cn=Admin [posixGroup] {memberUid=andrew, memberUid=johny}
cn=Right {resource:ftp1, action:all}
cn=Right {resource:ftp2, action:all}
cn=Editor [posixGroup] {memberUid=joseph}
cn=Right {resource:ftp1, action:list}
ou=People
cn=andrew {uid=andrew}
cn=Right {resource:ftp3, action:all}
cn=johny {uid=johny}
cn=joseph {uid=joseph}
括号 {} 中是属性。好吧,当 andrew 连接到 ftp3 时,我想检查权限,因此我查询:
(|(memberUid=andrew)(uid=andrew))
但我只得到 cn=Rights 的父元素:cn=andrew 和 cn=Admin。是否可以使用按父元素中定义的 memberUid uid 元素进行过滤来编写查询以返回 cn=Right 元素?或者必须以某种方式更改结构。非常感谢您抽出时间。Andrew
答案1
使用您当前的模式,我相信您必须执行两组查询:
- 使用现有的查询来查找匹配的用户和组。
- 对于找到的每个条目,查询每个条目以查看其是否有
Right
条目,设置基本 DN到您在步骤 1 中找到的条目。
或者您可以更改结构,以便用户和组具有多值right
条目,也许类似于:
cn=Admin [posixGroup] {memberUid=andrew, memberUid=johny,
right: ftp1/all, right: ftp2/all}
cn=Editor [posixGroup] {memberUid=joseph, right: ftp1/list}
...
cn=andrew {uid=andrew, right: ftp3/all}
您的查询将相同,但您将获得right
返回集中的属性(无需进行任何进一步的查询)。或者,如果您知道进行查询时请求的服务和权限级别,您也可以将其输入:
(&((|(memberUid=andrew)(uid=andrew)))(right=ftp3/all))
如果您至少获得一个结果,那么您就知道可以授予访问权限;否则,拒绝访问。