2017-11-30 23 views
2

LDAP 사용자의 주어진 사용자와 비밀번호가 올바른지 테스트하고 싶습니다.JNDI를 사용한 LDAP 인증

나는 jndi가 사용할 라이브러리임을 분류했습니다.

나는이 간단한 클래스를 발견

package myldap; 

import java.util.Hashtable; 
import javax.naming.AuthenticationException; 
import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
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; 


// boolean function to test user and pwd 
public static boolean userVerify(String user, String password){ 
boolean userVerify = false; 
Hashtable env = new Hashtable(); 
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); 
env.put(Context.PROVIDER_URL, "ldap://192.168.48.10"); 
env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
env.put(Context.SECURITY_PRINCIPAL, "CN=" + user + ",conn"); 
env.put(Context.SECURITY_CREDENTIALS, password); 

try { 
DirContext authContext = new InitialDirContext(env); 
userVerify = true; 
authContext.close(); 
} catch (AuthenticationException authEx) { 
//("Authentication Exception!"); 
userVerify = false; 
} catch (NamingException namEx) { 
//("Something went wrong!"); 
userVerify = false; 
} 
return userVerify; 
} 

내가 그것을 내가 매개 변수와 함께 장난하고 작동하도록 노력하고 있기 때문이다. 내가 함수에 넣어 값은 내가 AuthenticationException를 얻을 수 위의와

INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); 
PROVIDER_URL, "ldap://192.168.48.10"); 
SECURITY_AUTHENTICATION, "simple"); 
SECURITY_PRINCIPAL, "CN=" + user + ",conn"); 
SECURITY_CREDENTIALS, password); 

있습니다, 그게 내가 솔루션에 덜 가깝다 것 같다, 그래서 내가, 내가 NamingException 얻는 일을 변경하여 달성 할 수있는 최선의 결과입니다.

특히 SECURITY_PRINCIPAL에 대해 확실하지 않습니다.

경험이있는 사람이 누구이며 그 값을 정확하게 전달하는 방법에 대한 조언을 제공 할 수 있습니까? 물론 연결하고 예외를 발생시키지 않으려합니다.

답변

1

SECURITY_PRINCIPAL은 인증 할 사용자의 전체 DN이어야합니다.

일반적으로 자신의 전자 메일 주소와 같은 사용자의 고유 속성을 사용하여 DIT의 이전 검색을 수행해야하며 일반적으로 DIT에 내장 된 다른 관리 사용자로 인증해야합니다. 해당 검색을 수행 할 권리. 그런 다음 DN을 찾으면 SECURITY_PRINCIPAL을 변경하고 다시 연결합니다.

+0

답장을 보내 주셔서 감사합니다. SECURITY_PRINCIPAL은 "CN = john, OU = ACME 사용자, OU = OU ACME 내부, DC = ACME, DC = acmesystems, DC = com"과 같아야 함을 의미합니까? "john @ acme"과 같은 사용자 이름 만 전달해야한다면 어떻게해야합니까? – LaBracca

+0

나는 그 대답을했다고 믿는다. 어떤 LDAP 서버를 사용하고 있습니까? – EJP