Shiro JndiLdapRealm针对LDAP的授权

Shiro JndiLdapRealm针对LDAP的授权,ldap,shiro,Ldap,Shiro,明确地说,授权在默认情况下是禁用的,用户应该通过子类化和重写方法来实现对LDAP服务器的授权。 是否有关于如何执行此操作(包括处理与LDAP服务器的通信/协议)的示例代码?您应该实现自己的LdapRealm扩展JndiLdapRealm。 在这个实现中,您将重写queryForAuthorizationInfo();下面是一个简单的例子: protectedauthorizationinfo queryForAuthorizationInfo(PrincipalCollection主体,Ldap

明确地说,授权在默认情况下是禁用的,用户应该通过子类化和重写方法来实现对LDAP服务器的授权。
是否有关于如何执行此操作(包括处理与LDAP服务器的通信/协议)的示例代码?

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

protectedauthorizationinfo queryForAuthorizationInfo(PrincipalCollection主体,LdapContextFactory LdapContextFactory)引发NamingException{
字符串用户名=(字符串)getAvailablePrincipal(主体);
//执行上下文搜索
LdapContext LdapContext=ldapContextFactory.getSystemLdapContext();
设置角色名称;
试一试{
roleNames=getRoleNamesForUser(用户名,ldapContext);
}最后{
LdapUtils.closeContext(ldapContext);
}
返回buildAuthorizationInfo(角色名称);
}
受保护的AuthorizationInfo buildAuthorizationInfo(设置角色名称){
返回新的SimpleAuthorizationInfo(角色名称);
}
受保护集getRoleNamesForUser(字符串用户名,LdapContext LdapContext)引发NamingException{
设置角色名称;
roleNames=新的LinkedHashSet();
SearchControls searchCtls=新的SearchControls();
searchCtls.setSearchScope(SearchControls.SUBTREE_范围);
//SHIRO-115-防止潜在代码注入:
String searchFilter=“(&(objectClass=*)(CN={0}))”;
Object[]searchArguments=新对象[]{username};
NamingEnumeration answer=ldapContext.search(searchBase、searchFilter、searchArguments、searchCtls);
while(answer.hasMoreElements()){
SearchResult sr=(SearchResult)answer.next();
if(log.isDebugEnabled()){
log.debug(“检索用户[“+sr.getName()+”]”的组名);
}
Attributes attrs=sr.getAttributes();
如果(属性!=null){
NamingEnumeration ae=attrs.getAll();
while(ae.hasMore()){
属性attr=(属性)ae.next();
if(attr.getID().equals(“memberOf”)){
集合groupNames=LdapUtils.getAllAttributeValues(attr);
if(log.isDebugEnabled()){
log.debug(“为用户[“+用户名+”]:“+组名找到的组”);
}
集合rolesForGroups=getRoleNamesForGroups(组名);
roleNames.addAll(rolesforgroup);
}
}
}
}