Java-从 LDAP 中检索 shiro 的权限

Posted

技术标签:

【中文标题】Java-从 LDAP 中检索 shiro 的权限【英文标题】:Java- Retrieving permissions from LDAP for shiro 【发布时间】:2014-04-25 09:31:49 【问题描述】:

我正在尝试使用带有 shiro 的 java 应用程序获取 LDAP 对象的用户权限(读取、写入、浏览...)。我对 LDAP 没有太多经验。我用 Apache Directory Studio 设置了一个服务器来进行测试。然后我创建了一个域(dc=testdomain)并添加了一个带有“accessControlSubentry”对象类的子条目并添加了“prescriptiveACI”属性。如果我使用 Apache DS 浏览服务器并且我可以在我的 java 应用程序中连接到服务器,那么 Everthing 的工作方式应该如此。

为了获得权限,我从 shiro 继承了 ActiveDirectoryRealm。但我无法让查询获取子条目。

private Set<String> getPermissionsForUser(String username, LdapContext ldapContext) throws NamingException
    Set<String> permissions;
    permissions = new LinkedHashSet<String>();

    SearchControls searchCtls = new SearchControls();
    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    searchCtls.setReturningAttributes(new String[]"prescriptiveACI");

    String searchFilter = "(objectClass=subentry)";
    String searchBase = "dc=testdomain";
    NamingEnumeration answer = ldapContext.search(searchBase, searchFilter, searchCtls);

    while (answer.hasMoreElements()) 
        SearchResult sr = (SearchResult) answer.next();
        if (log.isDebugEnabled()) 
            log.debug("Retrieving permissions for user [" + sr.getName() + "]");
        

        Attributes attrs = sr.getAttributes();

        if (attrs != null) 
            NamingEnumeration ae = attrs.getAll();
            while (ae.hasMore()) 
                Attribute attr = (Attribute) ae.next();

                if (attr.getID().equals("prescriptiveACI")) 

                    if (log.isDebugEnabled()) 
                        log.debug("Permissions found");
                    
                
            
        
    
    return permissions;


当我将 searchFilter 更改为“(objectClass=*)”时,我得到了域中的所有 OrganisationUnits。但我似乎无法找到 prescriptiveACI 属性所需的子条目对象。

这是我的 Shiro.ini 文件的内容

activeDirectoryRealm = org.apache.shiro.realm.activedirectory.ActiveDirectoryRealmPermissions
activeDirectoryRealm.systemUsername = uid=admin,ou=system
activeDirectoryRealm.systemPassword = secret
activeDirectoryRealm.url = ldap://localhost:10389
activeDirectoryRealm.searchBase = ""

如何制作搜索查询子条目?或者有没有更好的/替代的方法来获得 LDAP 服务器的权限?

【问题讨论】:

【参考方案1】:

所以您想查找所有具有prescriptiveACI 属性的accessControlSubentry 对象实例?

试试这个:

(&(objectClass=accessControlSubentry)(prescriptiveACI=*))

【讨论】:

以上是关于Java-从 LDAP 中检索 shiro 的权限的主要内容,如果未能解决你的问题,请参考以下文章

我在骆驼下使用 apache shiro,我无法使用 ldap/active 目录将组映射到角色

如何使用 Spring 安全性从 Active Directory LDAP 填充 LDAP 权限?

使用Java从LDAP检索sidHistory

Java EE 7基于数据库的Apache Shiro配置

Grails Shiro LDAP用户/角色身份验证:如何/如何捕获和存储以供重用

Apache Shiro LDAP 配置(两步验证)