Java-从shiro检索LDAP的权限

时间:2014-03-19 09:04:03

标签: java ldap shiro

我试图使用带有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 个答案:

答案 0 :(得分:1)

所以你想找到accessControlSubentry属性的prescriptiveACI个对象的所有实例?

试试这个:

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