javax.naming.InvalidNameException:[LDAP:错误代码34 - 无效的DN]

时间:2013-09-16 15:40:43

标签: java ldap

我是一名大学生。现在,我正在做一个必须使用LDAP连接来验证登录过程中用户的用户名和密码的项目。所以,我的网站是用JSP开发的。我试图解决代码的错误,但我不能。我是否犯了一些错误?

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="java.util.regex.*" %>
<%@ page import="javax.naming.directory.*" %>
<%@ page import="java.util.Hashtable.*" %>
<%@ page import="javax.naming.ldap.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <%
            String username = request.getParameter("email");
String password = request.getParameter("password");
            Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://ldap-pj.sit.kmutt.ac.th");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);

try {
            //Connect with ldap
            new InitialLdapContext(env, null);  

            //Connection succeeded
            System.out.println("Connection succeeded!");
        } catch (AuthenticationException e) {

            //Connection failed
            System.out.println("Connection failed!");
            e.printStackTrace();
        }  
%>
    </body>
</html>

我从运行代码中得到了这个错误信息。

  

HTTP状态500 -

     

输入例外报告

     

消息

     

description服务器遇到阻止的内部错误()   它来自履行这一要求。

     

例外

     

org.apache.jasper.JasperException:处理发生异常   第33行的JSP页面/ldap_checking.jsp

     

30:31:尝试{32://连接ldap 33:new   InitialLdapContext(env,null); 34:35://连接   成功36:System.out.println(“连接成功!”);

     

堆栈跟踪:     org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)     org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)     org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)     org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)     javax.servlet.http.HttpServlet.service(HttpServlet.java:722)root   原因

     

javax.servlet.ServletException:javax.naming.InvalidNameException:   [LDAP:错误代码34 - 无效的DN]     org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:911)     org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:840)     org.apache.jsp.ldap_005fchecking_jsp._jspService(ldap_005fchecking_jsp.java:212)     org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)     javax.servlet.http.HttpServlet.service(HttpServlet.java:722)     org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)     org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)     org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)     javax.servlet.http.HttpServlet.service(HttpServlet.java:722)root   原因

     

javax.naming.InvalidNameException:[LDAP:错误代码34 - 无效的DN]     com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3028)     com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2835)     com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2749)     com.sun.jndi.ldap.LdapCtx。(LdapCtx.java:316)     com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:193)     com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:211)     com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154)     com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84)     javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)     javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)     javax.naming.InitialContext.init(InitialContext.java:242)     javax.naming.ldap.InitialLdapContext。(InitialLdapContext.java:153)     org.apache.jsp.ldap_005fchecking_jsp._jspService(ldap_005fchecking_jsp.java:97)     org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)     javax.servlet.http.HttpServlet.service(HttpServlet.java:722)     org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)     org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)     org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)     javax.servlet.http.HttpServlet.service(HttpServlet.java:722)注意   Apache中提供了根本原因的完整堆栈跟踪   Tomcat / 7.0.27日志。

     

Apache Tomcat / 7.0.27

2 个答案:

答案 0 :(得分:6)

这是重要的一句话:     javax.naming.InvalidNameException:[LDAP:错误代码34 - 无效的DN]

你可以看看这里: https://wiki.servicenow.com/index.php?title=LDAP_Error_Codes

代表34的含义,但看起来你尝试使用的专有名称是不正确的。看起来你的校长可能格式不正确。在执行ldap身份验证时,请参阅oracle的本指南: http://docs.oracle.com/javase/jndi/tutorial/ldap/security/ldap.html

在设置环境条目的地方特别注意它的这一部分:

env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");

答案 1 :(得分:2)

堆栈跟踪中的“javax.naming.InvalidNameException:[LDAP:错误代码34 - 无效DN]”是关键。您的LDAP服务器不喜欢您发送它的值。我建议完全限定用户名,例如cn = username,ou = some_container,o = mycompany。实际语法将由LDAP服务器驱动。