2013-09-16 61 views
2

我是一名大學生。現在,我正在執行一個項目,該項目必須使用LDAP連接在登錄過程中驗證用戶的用戶名和密碼。所以,我的網站是使用JSP開發的。我試圖解決代碼的錯誤,但我不能。我是否犯了一些錯誤?javax.naming.InvalidNameException:[LDAP:error code 34 - invalid DN]

<%@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 -

類型異常報告

消息

描述服務器遇到一個內部錯誤(),從完成此請求防止 它。

例外

org.apache.jasper.JasperException:發生異常處理 JSP頁/ldap_checking.jsp在管線33

30:31:嘗試{32://連接以ldap 33:新的 InitialLdapContext(env,null); 34:35://連接 成功36:System.out.println(「Connection succeeded!」);

堆棧跟蹤: 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 (HttpServlet.java:722) org.apache.jasper.servlet.JspServletWrapper。服務(JspServletWrapper.java:432) org.apache.jasper.servlet.Js pServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:722)note備註 full堆棧跟蹤的根本原因可在Apache Tomcat/7.0.27日誌中找到。

的Apache Tomcat/7.0.27

+0

如果你在Mac上,請確保你的build.xml文件中沒有任何'"' – Archmede

回答

4

這是重要的一行: javax.naming.InvalidNameException:LDAP:錯誤代碼34 - 無效DN]

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

34是什麼意思,但它看起來像你試圖使用的着名名稱是不正確的。它看起來像你的委託人可能格式不正確。請參見從Oracle本指南做LDAP認證: 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"); 
+0

我已經嘗試過,但它不起作用。感謝您的回答。 :D – Best

+0

在代碼中,您看起來像是收到電子郵件並將其作爲SECURITY_PRINCIPAL傳入。看看我上面發佈的代碼的格式。字符串'S.用戶'是用戶名。它是一個組織單位和一個組織內的領域。如果您不熟悉我在談論的內容,則應該查看LDAP結構:http://en.wikipedia.org/wiki/Distinguished_Name#Directory_structure – dsingleton

0

的「javax.naming.InvalidNameException:LDAP:錯誤代碼34 - 無效DN]「是你的堆棧跟蹤中的關鍵。您的LDAP服務器不喜歡您發送的值。我建議完全限定用戶名,例如cn = username,ou = some_container,o = mycompany。實際的語法將由您的LDAP服務器驅動。