在Grails和SpringSecurity中访问Oracle Internet Directory(OID)中的嵌套LDAP角色

时间:2012-12-03 23:34:32

标签: grails spring-security ldap

在我们的LDAP目录中,我们有用户,他们被映射到组。这些组可以映射到其他组。例如:

cn=group1,cn=groups,dc=example,dc=com
    uniquemember cn=user1,cn=user,dc=example,dc=com
cn=group2,cn=groups,dc=example,dc=com
    uniquemember cn=user2,cn=user,dc=example,dc=com
    uniquemember cn=group1,cn=user,dc=example,dc=com

所以User1属于Group1,但User2属于Group2,而Group2又属于Group1

在Grails中,User1具有Group1的权限,但User2仅具有Group2的权限。从我所看到的,没有办法让它递归地看树。实际上,我可能只需要一个2级的层次结构,但即使这样也不行。

我正在尝试通过Custom UserDetailsContextManager来查看我是否可以迭代初始结果并按组重新查询LDAP,但我想我会看到是否有更简单/更好的方式。

2 个答案:

答案 0 :(得分:1)

您可能已经看过这个,但这来自文档:

//如果您不想支持组成员资格递归(组中的组),请使用以下设置 // grails.plugins.springsecurity.ldap.authorities.groupSearchFilter ='member = {0}'//特定于Active Directory

//如果您希望支持将group作为成员(递归组)的组,请使用以下命令 grails.plugins.springsecurity.ldap.authorities.groupSearchFilter ='(成员:1.2.840.113556.1.4.1941:= {0})'//特定于Active Directory

http://grails-plugins.github.com/grails-spring-security-ldap/docs/manual/guide/2.%20Usage.html

答案 1 :(得分:0)

Oracle OID有一个product-specific extension用于遍历层次结构,称为CONNECT_BY,它具有LDAP OID 2.16.840.1.113894.1.8.3。您可以将其添加为请求控件,以要求服务器根据您指定的属性连接/跟踪层次结构。这可以使用Java LDAP客户端程序或使用OpenLDAP ldapsearch之类的东西来完成,尽管设置有点棘手。

如果您想使用Java来跟踪层次结构,this page包含sample program,其中显示了如何设置所需的javax.naming.ldap.Control实现类,在本例中名为ConnectByControl

您也可以使用ldapsearch执行此类分层搜索,但需要对所需控件值进行一些准备和暗示理解,因为值会连接到base64编码。该值分为两部分 - 跟随我的深度(0 =无限制),后跟连接属性名称(在这种情况下,uniquemember是所需的名称)。将查询中的baseDN设置为要开始分层搜索的条目。

ldapsearch -H ldap://myoidserver.mycompany.com:389 -e 2.16.840.1.113894.1.8.3=MBECAQAEDHVuaXF1ZW1lbWJlcg== -b cn=some_group_containing_groups_nested_by_uniquemember,cn=some_groups,dc=mycompany,dc=com "(objectClass=*)" dn uniquemember

-e 2.16.840.1.113894.1.8.3=添加CONNECT_BY请求控件。对于上面提到的深度和属性名,值MBECAQAEDHVuaXF1ZW1lbWJlcg==是ASN.1 BER编码然后是base64编码的值0uniquemember。这将首先打印dn及其cn=some_group_containing_groups_nested_by_uniquemember,...及其直接(用户)uniquemember,然后每个uniquemember将连接"或遵循。如果该条目本身具有一组uniquemember,即它是嵌套组,则该过程将继续,直到到达没有嵌套uniquemember s的叶/用户条目。