Liberty WebApp Active Directory身份验证

时间:2017-08-11 13:32:01

标签: java active-directory ldap websphere-liberty

这是我的小测试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="(&amp;(objectClass=person)(|(uid=%v)(samAccountName=%v)(userPrincipalName=%v)))"/>
</ldapRegistry>

我认为我的问题是server.xml中的userFilter是某种方式。 当我将其设置为以下内容时:`

(&amp;(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的标准值也会导致相同的异常。

1 个答案:

答案 0 :(得分:0)

所以,我使用以下过滤器,isValidUser上的userSecurityName方法有效: (&amp;(|(objectcategory=person)(objectclass=person))(uid=%v)) (liberty的server.xml文件需要amp;,否则没有必要)

我不知道为什么或如何在AD中检查这一点,但在使用 userSecurityName 时似乎没有objectclass=person,但有一个objectcategory=person。 不使用 userSecurityName 时,相反,但反过来似乎也是如此。