2013-01-05 2 views
0

스프링을 기반으로 한 웹 애플리케이션을 구현해야만 사용자가 LDAP 데이터를 관리 할 수 ​​있습니다. LDAP에 대한 연결은 JNDI 프레임 워크에서만 수행되어야합니다 (SpringLDAP는 허용되지 않습니다).스프링에서 LDAP 연결

이를 위해 필자는 기본 작업 (추가, 업데이트, 삭제, 목록 등)을 수행하는 유틸리티 클래스를 구현했습니다.

다음은이 클래스의 코드의 짧은 블록 : 나는 LdapUtility.getInstance()...를 호출하여 내 모든 메서드에 액세스 할 수있는이 코드

public class LdapUtility { 


    private static LdapUtility instance; 

    private DirContext dirContext; 


    public static LdapUtility getInstance() { 

     if(LdapUtility.instance == null) 
      LdapUtility.instance = new LdapUtility(); 

     return LdapUtility.instance; 
    } 

    /** 
    * Connect to the LDAP 
    */ 
    private LdapUtility() { 

     Hashtable env = new Hashtable(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, "ldap://localhost:389"); 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=my-domain,dc=com"); 
     env.put(Context.SECURITY_CREDENTIALS, "secret"); 

     try { 
      dirContext = new InitialDirContext(env); 
     } 
     catch(Exception ex) { 
      dirContext = null; 
     } 
    } 

    public void addUser(User u) { 

      dirContext.createSubcontext(....); //add user in the LDAP 
    } 
} 

는하지만, LDAP에 대한 연결이 해제되지 않습니다.

또 다른 방법은 각 작업 전에 LDAP에 연결하는 것입니다 만,이 경우에는 LDAP에 너무 많은 연결이있을 것입니다 ...

그래서 여기 내 질문은 : 가장 우아한 무엇인지/이러한 방법에 가장 현명한 방법으로 액세스 할 수 있습니까?

는 LDAP에 연결하는 방법에는 여러 가지가 있습니다

답변

0

:-) 사전에 감사합니다. javax.naming. *를 사용하는 것은 그 중 하나입니다. Javadoc에서는 SPI 공급자의 클래스가 자체 연결을 관리하므로 걱정할 필요가 없습니다. 질문에 대한 답변 일 수도 있습니다. JDK 문서 및 Context가 연결 및 네트워크를 관리하는 방법을 참조하십시오. http://docs.oracle.com/javase/6/docs/api/javax/naming/ldap/LdapContext.html .

더 많은 JDBC와 같은 액세스에 익숙하다면, 원하는대로 http://www.openldap.org/jldap/을 찾을 수 있습니다. 거기에서 당신은 완전히 당신의 통제하에 conection을 가지며 JDBC에서와 같은 방식으로 그들을 다룰 수 있습니다. 원하는 풀링 라이브러리를 사용할 수 있습니다. 이미 스프링을 사용하고 있기 때문에

+0

문제는 ldap에 연결하는 데 사용되는 방법과 관련이 없습니다. 필자의 경우 JNDI (클래스 프로젝트)를 사용해야한다. 내 문제는 LDAP 연결을 현명하게 관리하면서 내 컨트롤러에서 내 클래스의 메서드에 액세스하는 방법입니다. – user1901206

1

, 나는 Spring LDAP를 사용하는 것이 좋습니다 :

봄 LDAP는 Spring의 JdbcTemplate을의 패턴에 따라 LDAP 작업을 단순화하기위한 자바 라이브러리입니다. 프레임 워크는 컨텍스트 찾기 및 닫기, 결과 루핑, 값 및 필터 인코딩/디코딩 등과 같은 일반적인 잡일을 덜어줍니다.

특히 LDAP 및 잠재적 인 성능 문제에 익숙하지 않은 사용자라면이 모든 유틸리티 라이브러리를 사용하여 많은 어려움을 겪을 수 있습니다.

당신은 스프링 설정에 LDAP 연결 설정을 구성합니다

return ldapTemplate.search(
    "", "(objectclass=person)", 
    new AttributesMapper() { 
     public Object mapFromAttributes(Attributes attrs) 
      throws NamingException { 
      return attrs.get("cn").get(); 
     } 
    }); 
0

정확한 요구 사항을 알면서 : 당신은 LDAP 작업을 수행 할 필요가 어디

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource"> 
    <property name="url" value="ldap://localhost:389" /> 
    <property name="base" value="dc=example,dc=com" /> 
    <property name="userDn" value="cn=Manager" /> 
    <property name="password" value="secret" /> 
</bean> 

<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate"> 
    <constructor-arg ref="contextSource" /> 
</bean> 

당신은 다음 바로 LdapTemplate을 사용할 수 있습니다 핵심 질문을 "연결을 열거 나 닫을 때"로 해석합니다.

내 수정 구슬은 연결 풀을 사용하고 싶다고 알려줍니다. 사실, 이것은 풀에서 처리되기 때문에 연결을 명시 적으로 닫지는 않지만 할당에 대해서는 문제가 될 수 있습니다. 그것은 매우 쉽습니다 :

// Enable connection pooling 
env.put("com.sun.jndi.ldap.connect.pool", "true"); 

complete source codeOracle's basic LDAP tutorial에서 참조됩니다.(금지 된) 스프링, 내가 빨리 simillar 뭔가를 구현하는 것이없는

0

: (지연되는 경우) 당신이 봄에서 찾을 수

  • (예를 간단한 콜백 인터페이스를 생성 - JpaCallback.execute을 (EntityManager의 em)) - LDAP의 경우 - MyLdapCallback.execute (LdapConnection 연결) - OpenLdap 또는 SDK 컨텍스트의 개체 인 LdapConnection 대신 필요한 항목을 상상해보십시오. (단지 프레젠테이션) 식으로 뭔가 :
    ... 
    interface LdapCallback<T> { 
        T execute(DirContext ctx) throws NamingException, IOException; 
    } 
    ... 
    private <T> T execute(LdapCallback<T> callback) throws NamingException, IOException { 
        T result = null; 
        LdapContext ctx = new InitialLdapContext(); 
        try { 
         result = callback.execute(ctx); 
        } finally { 
         if (tls != null) { 
          tls.close(); 
         } 
         ctx.close(); 
        } 
        return result; 
    } 
    ... 
    

일단 당신이 전화 콜백을 통해 실행 전화 (콜백) 각 LDAP에 대해 익명 클래스를 만들 것이다, 다.

  • (데 더 많은 시간을)를 구현 광고 1 + 자체가 (명시 적으로 내 코드에 그렇게하지 않고) 위의 래퍼 내에서 내 방법을 실행합니다 측면
와 주석으로 표시 내 방법을 바꿈됩니다 AOP를 만들