2013-06-13 2 views
0
package com.ecom.data.access.controller; 


import java.util.ArrayList; 
import java.util.Hashtable; 
import java.util.List; 

import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.directory.Attribute; 
import javax.naming.directory.Attributes; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.InitialDirContext; 
import javax.naming.directory.SearchControls; 
import javax.naming.directory.SearchResult; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.opends.server.admin.client.ldap.LDAPConnection; 
import org.opends.server.types.ResultCode; 
import org.springframework.ldap.AuthenticationException; 
import org.springframework.ldap.NamingException; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.Controller; 

import com.unboundid.ldap.sdk.BindRequest; 
import com.unboundid.ldap.sdk.BindResult; 
import com.unboundid.ldap.sdk.SimpleBindRequest; 



public class LoginController implements Controller 
{ 

    public static String usersContainer = "dc=example,dc=com"; 



    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception 
    { 

     String givenName1=request.getParameter("name"); 
     String userpassword1=request.getParameter("password"); 
      System.out.println("Ldap wellcome"); 

     final SimpleBindRequest bindRequest=new SimpleBindRequest(givenName1, userpassword1); 
     System.out.println("before"); 
     System.out.println(bindRequest); 
     Hashtable<String, Object> env = new Hashtable<String, Object>(11);// Here we set some connection Hashtable for JNDI 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, "ldap://localhost:389"); 
     env.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager"); 
     env.put(Context.SECURITY_CREDENTIALS, "admin"); 
     DirContext ctx = null; 

     NamingEnumeration<?> results = null; 
     try { 
      ctx = new InitialDirContext(env); 
      SearchControls controls = new SearchControls(); 
      controls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
      String lookup="givenName="+givenName1+",dc=example,dc=com"; 
      String obj = "(objectclass=*)"; 
      results=ctx.search(lookup, obj, controls); 
      while (results.hasMore()) 
      { 
       SearchResult searchResult = (SearchResult) results.next(); 
       Attributes attributes = searchResult.getAttributes(); 
       Attribute attruser = attributes.get("givenName"); 
       Attribute attrpwd=attributes.get("uid"); 
       Attribute org=attributes.get("o"); 
        String cn = (String)attruser.get(); 
        String cn1 = (String)attrpwd.get(); 
        String cn2 = (String)org.get(); 
      List<String> li = new ArrayList<String>(); 
      li.add(cn); 
      li.add(cn1); 
      li.add(cn2); 
       if(givenName1.equals(cn) && userpassword1.equals(cn1)) 
       { 

        ModelAndView modelSuccess=new ModelAndView("loginPage"); 
        modelSuccess.addObject("msgSuccess", li); 
        return modelSuccess; 
        } 
        else 
        { 
        ModelAndView modelError=new ModelAndView("errorPage"); 
        modelError.addObject("msgError", "Invalid UserName and Password"); 

        return modelError; 
        } 
        } 

       } catch (Throwable e) 
       { 
       } finally 
       { 
        if (results != null) 
        { 
         try 
         { 
          results.close(); 

         } catch (Exception e) 
         { 
         } 
        } 
        if (ctx != null) { 
         try { 
          ctx.close(); 
          } catch (Exception e) { 
          } 
        } 
       } 
      return null; 
     } 

} 

저는 스프링 3을 사용하고 있습니다. LDAP로 작업 중입니다. 사용자 이름과 암호가 맞으면 사용자 인증을해야합니다. 내 OpenDs에는 많은 필드가 있습니다. 주어진 이름과 이름을 사용하고 있다면 인증 할 것이지만, 암호를 사용하면 openDs에 저장된 암호가 암호화되어 있기 때문에 인증되지 않습니다. 암호를 일치시켜야합니다. 이것에 대한 제안을 해주십시오. 위와 같이 코드를 사용하고 있습니다.비밀번호를 사용하여 Ldap에서 사용자를 인증하는 방법

+0

jndi를 전혀 사용하지 않는 이유는 무엇입니까? 바인딩과 검색을하기 위해 다른 unboundid api를 사용하지 않는 이유는 무엇입니까? – FearlessHyena

답변

1

암호는 "해시"라고하는 암호화 다이제스트로 저장해야하며 종종 userPassword 또는 authPassword 속성에 저장해야합니다. LDAP 클라이언트는 BIND 요청을 사용하여 세션의 권한 부여 상태를 변경하여 인증합니다. SimpleBindRequest는 세션의 승인 상태로 사용될 계정의 고유 이름 (기본 키)과 일반 텍스트의 암호를가집니다.

SimpleBindRequest는 보안 연결 (SSL 또는 StartTLS 확장 요청을 사용하여 승격 된 비보안 연결)을 통해 서버로 전송되어야합니다. 서버가 암호를 해독 할 수 있어야하므로 DIGEST-MD5 또는 CRAM-MD5와 같은 방법은 안전하지 않거나 덜 안전하므로 암호는 되돌릴 수있는 암호화로 저장해야합니다. 다른 안전한 방법으로는 GSSAPI 또는 EXTERNAL SASL 메커니즘,

LDAP 디렉토리 서버는 표시된 비밀번호를 확인하고 확인에 성공하면 세션의 승인 상태를 변경 한 다음 BIND 응답을 클라이언트에 반환합니다 .BIND 응답 결과 코드가 포함되어 있습니다. 결과 코드가 0이면 인증 (및 BIND 작업)이 성공한 것입니다.

LDAP 클라이언트는 사전 인코딩 된 암호를 LDAP 서버에 제공하면 안됩니다. 암호 기록 관리 및 암호 품질 관리의 다른 측면

관련 문제