LDAP过滤器的处理顺序如何?

时间:2017-08-14 13:17:04

标签: java active-directory ldap websphere-liberty

我的Active Directory中有两种用户:技术用户和用户用户。

使用LDAP过滤器(&(objectclass=person)(uid=%v))我得到了一些结果。

但是对于我的应用程序,我需要一个更详细的过滤器,否则就没有结果(com.ibm.websphere.security.UserRegistry的checkPassword方法)。所以我想到了这个过滤器:

(&(|(objectcategory=person)(objectclass=person))(uid=%v))

这适用于技术用户,但另一方面我得到了EntryNotFoundException: CWIML4001E:

为什么?难道它至少不能给我简单过滤器的结果吗?是否由于OR?:

而不处理过滤器组合
    1. uid =%v AND objectclass = person
    2. uid =%v AND objectcategory = person

我还尝试使用以下过滤器进行保存:

(|(&(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)部分的结果相同。

0 个答案:

没有答案