опитвам се да получа потребителски разрешения (четене, писане, разглеждане,...) за LDAP обекти, използвайки java приложение с shiro. Нямам много опит с LDAP. Настроих сървър с Apache Directory Studio с цел тестване. След това създадох домейн (dc=testdomain) и добавих подзапис с обектния клас "accessControlSubentry" и добавих атрибута "prescriptiveACI". Всичко работи както трябва, ако преглеждам сървъра с Apache DS и мога да се свържа със сървъра в моето java приложение.
За да получа разрешенията, подкласирах ActiveDirectoryRealm от shiro. Но не мога да накарам заявката да получи подзаписите.
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=*)", получавам всички организационни единици в домейна. Но просто не мога да намеря обектите на подзапис, които са ми необходими за атрибута 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 сървъра?