我是LDAP新手,我尝试在OpenLDAP上实施RBAC。我创建了一些用户(inetOrganizationPerson)并将它们放在组(groupOfNames)中。接下来,我使用用户组创建了一些角色(organizationalRole)和关联(roleOccupant),而不是直接将它们与用户关联。
我正在尝试编写一个可以给我一个给定用户角色的查询。它应确定用户所属的组或组以及分配给这些组的角色。
我想我可以通过两个单独的查询来完成它:
1)/ usr / local / bin / ldapsearch -x -b' ou = Groups,dc = example,dc = com' -s sub -LLL"(&(objectclass = groupOfNames)(member = uid = anurag,ou = People,dc = example,dc = com))" CN
2)/ usr / local / bin / ldapsearch -x -b' ou = Roles,dc = example,dc = com' -s sub -LLL"(&(objectclass = organizationalRole)(roleOccupant = cn = Administrators,ou = Groups,dc = example,dc = com))" CN
在第一个查询中,成员' anurag'是参数,它产生'管理员'作为用户' anurag'属于。 第二个查询需要管理员' (来自第一次查询)作为参数,它产生“管理员”#39;作为角色。
但我正在寻找,如何通过单一查询实现这一目标,只要它更有效率?更重要的是,它通常是如何完成的?
答案 0 :(得分:3)
在LDAP中,您正在寻找的是使用Deref控件完成的。
答案 1 :(得分:0)
LDAP不是关系数据库。 LDAP是关于控制目录结构的,并且针对大型读取,小写入情况(例如授权)进行了优化。 OpenLDAP,尤其是LMDB,在这方面非常有效。执行此操作的正确方法是使用两个查询,可能更多,具体取决于您需要收集的数据。如果你需要对两个条目进行比较,那么我会说这应该以编程方式完成,而不是在数据存储区内。
rlandster在对该问题的评论中提供的链接在第二个答案中有另一个链接,该链接是一篇好文章。这篇文章特别讨论了如何不将LDAP用于博客网站,因此他并没有从SQL和LDAP的广泛角度来区分这些差异,但他确实做了这样的比较:
某些应用程序需要密码作为Unix crypt,其他需要MD5 哈希或其他更复杂的结构。我们不能存储 (受保护)纯文本字段,然后提供函数或查询 从各种加密的单一来源返回密码 形式
正如他所说,您无法提供从不同数据源返回多个值的函数或子查询。他所拥有的语气对LDAP是负面的,但他再次争论SQL作为博客网站的后端。您应该只在LDAP中运行两个SEARCH请求,然后比较和/或使用需要它的应用程序中的数据,而不是尝试组合数据。
答案 2 :(得分:0)
如果使用Java,可能的替代方法是使用http://directory.apache.org/fortress/,这是一个适用于OpenLDAP的完整RBAC实现。