【发布时间】:2014-04-19 06:52:58
【问题描述】:
我正在根据 LDAP 服务器对用户进行身份验证,我需要查看用户是否属于特定组。属于该组下的子组的所有用户也应该被允许登录。这是我目前正在使用的代码:
private String[] returnedAtts = { "sn", "givenName", "mail", "objectSid", "memberOf" };
SearchControls searchCtls = new SearchControls();
searchCtls.setReturningAttributes(returnedAtts);
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
LdapContext ldatCtxt = null;
try{
ldatCtxt= getInitialContext(userName, password);
}
catch(AuthenticationException e){
throw new AppException(AppMessageHandler.getClientString("invalidCredentials"));
}
String searchFilter = userSearchQuery.replace("$USERID$", userName);
NamingEnumeration<?> answer = ldatCtxt.search(searchBase, searchFilter,searchCtls);
String userGroup=null;
if(answer==null || !answer.hasMoreElements()){
throw new AppLoginException(AppMessageHandler.getClientString("invalidCredentials"));
}
SearchResult searchresult = (SearchResult) answer.next();
Attribute memberOf = (Attribute) searchresult.getAttributes().get("memberOf");
if(memberOf==null){
throw new AppLoginException(AppMessageHandler.getClientString("userNotInADGroup"));
}
userGroup = (String) memberOf.get();
String[] groups=userGroup.split(",");
boolean isMemberOfGroup = false;
for(String groupName:groups)
{
if(groupName.equals("CN="+appUserGrp))
isMemberOfGroup = true;
}
if(!isMemberOfGroup){
throw new AppLoginException(AppMessageHandler.getClientString("userNotInADGroup"));
}
当我检查特定组时这工作正常,但当来自子组的用户(它是父组的成员 - appUserGrp)时不起作用。有没有办法检查用户是否属于特定组或属于该组成员的任何子组?
这是我拥有的组结构示例:
组 1
- 用户1
- 用户2
-
子组 1
-用户3
-用户4
-
子组2
-用户5
组2
- 用户6
- 用户7
user1-5应该可以登录,但是user6和user7应该不能登录。
【问题讨论】:
-
您使用的 LDAP 服务器软件是什么?一些实现提供操作属性来检查嵌套组结构中的成员资格。
-
我正在使用 Microsoft Active Directory。
标签: java authentication ldap ldap-query