这是我的小测试servlet的代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
SearchResult result2 = null;
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>");
}
}
这是我的server.xml中的LDAP配置:
<ldapRegistry baseDN="o=appsdir" bindDN="cn=user123,ou=usersbind,o=appsdir" bindPassword="mostsecurePW" host="localhost" id="drd" ldapType="Microsoft Active Directory" port="389" realm="LdapRegistry" recursiveSearch="false" returnToPrimaryServer="true">
<ldapCache>
<attributesCache size="4000"/>
<searchResultsCache resultsSizeLimit="1000" timeout="600ms"/>
</ldapCache>
<activedFilters userFilter="(&(objectClass=person)(|(uid=%v)(samAccountName=%v)(userPrincipalName=%v)))"/>
</ldapRegistry>
我认为我的问题是server.xml中的userFilter是某种方式。 当我将其设置为以下内容时:`
(&(objectClass=person)(|(uid=%v))) <-- on purpose to clarify what was removed
我得到了输出:
Output: uid=testuser,ou=testing,ou=people,o=appsdir
Output: true
Output: false
但是当我向过滤器添加(samAccountName=%v)
和/或(userPrincipalName=%v)
时,我立即得到以下异常:
Exception caught: com.ibm.websphere.security.CustomRegistryException:
CWIML4520E: The LDAP operation could not be completed. The LDAP naming
exception javax.naming.OperationNotSupportedException: [LDAP: error code 53
- Search is not indexed]; remaining name 'o=appsdir'; resolved object
com.sun.jndi.ldap.LdapCtx@254ba79e occurred during processing.
使用|
(OR)时为什么不起作用?我认为这将通过这个过滤器,直到匹配。是否有一些关于它是如何工作的文档?
异常Search is not indexed
是什么意思?
顺便说一下。使用userFilter的标准值也会导致相同的异常。
答案 0 :(得分:0)
所以,我使用以下过滤器,isValidUser
上的userSecurityName
方法有效:
(&(|(objectcategory=person)(objectclass=person))(uid=%v))
(liberty的server.xml文件需要amp;
,否则没有必要)
我不知道为什么或如何在AD中检查这一点,但在使用 userSecurityName 时似乎没有objectclass=person
,但有一个objectcategory=person
。
不使用 userSecurityName 时,相反,但反过来似乎也是如此。