gpt4 book ai didi

ldap - Shiro JndiLdapRealm 针对 LDAP 的授权

转载 作者:行者123 更新时间:2023-12-04 18:47:21 24 4
gpt4 key购买 nike

JavaDoc for Shiro class JndiLdapRealm明确表示默认情况下禁用授权,并且用户应该通过继承和覆盖 来实现对 LDAP 服务器的授权。 JndiLdapRealm#doGetAuthorizationInfo 方法。
是否有关于如何做到这一点的示例代码,包括处理与任何地方可用的 LDAP 服务器的通信/协议(protocol)?

最佳答案

您应该实现自己的 LdapRealm 扩展 JndiLdapRealm。
在此实现中,您将覆盖 queryForAuthorizationInfo() ;这是一个简单的例子:

protected AuthorizationInfo queryForAuthorizationInfo(PrincipalCollection principals, LdapContextFactory ldapContextFactory) throws NamingException {

String username = (String) getAvailablePrincipal(principals);

// Perform context search
LdapContext ldapContext = ldapContextFactory.getSystemLdapContext();

Set<String> roleNames;

try {
roleNames = getRoleNamesForUser(username, ldapContext);
} finally {
LdapUtils.closeContext(ldapContext);
}

return buildAuthorizationInfo(roleNames);
}

protected AuthorizationInfo buildAuthorizationInfo(Set<String> roleNames) {
return new SimpleAuthorizationInfo(roleNames);
}

protected Set<String> getRoleNamesForUser(String username, LdapContext ldapContext) throws NamingException {
Set<String> roleNames;
roleNames = new LinkedHashSet<String>();

SearchControls searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

//SHIRO-115 - prevent potential code injection:
String searchFilter = "(&(objectClass=*)(CN={0}))";
Object[] searchArguments = new Object[]{ username };

NamingEnumeration answer = ldapContext.search(searchBase, searchFilter, searchArguments, searchCtls);

while (answer.hasMoreElements()) {
SearchResult sr = (SearchResult) answer.next();

if (log.isDebugEnabled()) {
log.debug("Retrieving group names 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("memberOf")) {

Collection<String> groupNames = LdapUtils.getAllAttributeValues(attr);

if (log.isDebugEnabled()) {
log.debug("Groups found for user [" + username + "]: " + groupNames);
}

Collection<String> rolesForGroups = getRoleNamesForGroups(groupNames);
roleNames.addAll(rolesForGroups);
}
}
}
}

关于ldap - Shiro JndiLdapRealm 针对 LDAP 的授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12173492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com