我的Active Directory中有两种用户:技术用户和用户用户。
使用LDAP过滤器(&(objectclass=person)(uid=%v))
我得到了一些结果。
但是对于我的应用程序,我需要一个更详细的过滤器,否则就没有结果(com.ibm.websphere.security.UserRegistry的checkPassword方法)。所以我想到了这个过滤器:
(&(|(objectcategory=person)(objectclass=person))(uid=%v))
这适用于技术用户,但另一方面我得到了EntryNotFoundException: CWIML4001E:
为什么?难道它至少不能给我简单过滤器的结果吗?是否由于OR?:
而不处理过滤器组合我还尝试使用以下过滤器进行保存:
(|(&(objectclass=person)(uid=%v))(&(objectcategory=person)(uid=%v)))
但结果是一样的。
一些背景知识:
我使用Liberty并在其上运行以下简单的servlet进行测试:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
if (WSSecurityHelper.isServerSecurityEnabled()) {
String testuser = "myuser";
String password = "mypassword";
UserRegistry registry = RegistryHelper.getUserRegistry("LdapRegistry");
response.getWriter().append("<p>Output: " + registry.getUserSecurityName(testuser) +"</p>");
response.getWriter().append("<p>Output: " + registry.isValidUser(testuser) +"</p>");
response.getWriter().append("<p>Output: " + registry.isValidUser(registry.getUserSecurityName(testuser)) +"</p>");
}else{
response.getWriter().append("<p>Output: No Sec Enabled</p>");
}
} catch (Exception e) {
response.getWriter().print("<p>Exception caught: " + e + " </p>");
}
}
当testuser不是技术用户时,应用程序在getUserSecurityName(testuser)
失败。
修改
LDIF techuser:
>> Dn: uid=techuser,ou=technical,ou=people,o=appsdir
1> someWorkingOrgAlias:
1> someHomeOrgAlias:
1> someWorkingOrg:
1> someUserSuspended:
1> mail:
1> givenName:
1> cn:
1> c:
1> someIsUserEnabledIntra:
1> someSupervisor:
1> someSourceProcess:
1> someAppResp:
2> someAncestors:
1> someHomeOrg:
1> someOrgs:
1> someAuthMode:
1> uid: techuser;
7> objectClass: someTechPerson; somePerson; sPerson; inetOrgPerson; organizationalPerson; person; top;
1> someUserEnabled:
1> sn:
LDIF用户用户:
>> Dn: uid=useruser,ou=employees,ou=people,o=appsdir
2> appsOrgs:
1> departmentNumber:
1> someLocationCode:
1> somePlant2:
1> ou:
1> someCompanyID:
1> somePlant1:
1> someHomeOrg:
6> someEntGrps:
4> someAuthGrps:
3> someScopedEntitlements:
1> telephoneNumber:
1> mail:
2> someAncestors:
1> c:
1> sn:
1> someCostCenter:
1> uid: useruser;
1> givenName:
1> cn:
8> objectClass: organizationalPerson; person; sEmployeePerson; sInternalEmployee; sPerson; inetOrgPerson; somePerson; top;
这就是我用LDP.exe可以看到的全部内容。我的搜索基础是o=appsdir
。
我试着进一步描述我的问题:
目前使用过滤器:
(|(&(objectclass=person)(uid=%v))(&(objectcategory=person)(uid=%v)))
我的代码和techusers
工作正常。
使用user users
后,我得The useruser entity was not found. Specify the correct entity or create the missing entity.
来自方法registry.getUserSecurityName("useruser")
。
从我的过滤器中移除objectcategory
部分:(|(&(objectclass=person)(uid=%v))(&(uid=%v)))
或仅使用(uid=%v)
可以获得结果,但在方法registry.isValidUser(registry.getUserSecurityName("useruser"))
失败后返回false(尽管它为&#39} ;有效的用户)。对于techusers
,这也失败了,尽管过滤器中的objectgategory
部分返回true。
我还尝试了以下过滤器:
(|(uid=%v)(&(objectclass=person)(uid=%v))(&(objectcategory=person)(uid=%v)))
与没有添加(uid=%v)
部分的结果相同。