|  | @@ -0,0 +1,170 @@
 | 
	
		
			
				|  |  | +package net.sf.acegisecurity.providers.dao.ldap;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.util.Hashtable;
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  | +import javax.naming.Context;
 | 
	
		
			
				|  |  | +import javax.naming.NamingException;
 | 
	
		
			
				|  |  | +import javax.naming.directory.InitialDirContext;
 | 
	
		
			
				|  |  | +import org.springframework.dao.DataAccessResourceFailureException;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * @see http://java.sun.com/products/jndi/tutorial/ldap/connect/config.html
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  | + * @author robert.sanders
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +public class InitialDirContextFactory {
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * LDAP URL (without the port) of the LDAP server to connect to; example
 | 
	
		
			
				|  |  | +     * <b>ldap://dir.mycompany.com:389/dc=mycompany,dc=com</b>  (port 389 is the standard LDAP port).
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private String URL;
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +    /** If your LDAP server does not allow anonymous searches then 
 | 
	
		
			
				|  |  | +     *  you will need to provide a username with which to login with;
 | 
	
		
			
				|  |  | +     *  this is that username.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private String managerUser;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    /** If your LDAP server does not allow anonymous searches then 
 | 
	
		
			
				|  |  | +     *  you will need to provide a username with which to login with;
 | 
	
		
			
				|  |  | +     *  this is the password of that user.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private String managerPassword;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    /** Type of authentication within LDAP; default is simple. */
 | 
	
		
			
				|  |  | +    private String authenticationType = "simple";
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    /** The INITIAL_CONTEXT_FACTORY used to create the JNDI Factory.
 | 
	
		
			
				|  |  | +     *  Default is "com.sun.jndi.ldap.LdapCtxFactory"; you <b>should not</b>
 | 
	
		
			
				|  |  | +     *  need to set this unless you have unusual needs.
 | 
	
		
			
				|  |  | +     **/
 | 
	
		
			
				|  |  | +    private String initialContextFactory = "com.sun.jndi.ldap.LdapCtxFactory";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /** Allows extra environment variables to be added at config time. */
 | 
	
		
			
				|  |  | +    private Map extraEnvVars = null;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    /** Use the LDAP Connection pool (in SUN JVMs)?; if true, then the 
 | 
	
		
			
				|  |  | +     *  LDAP environment property "com.sun.jndi.ldap.connect.pool" is added 
 | 
	
		
			
				|  |  | +     *  to any other JNDI properties. 
 | 
	
		
			
				|  |  | +     *  @see http://java.sun.com/products/jndi/tutorial/ldap/connect/pool.html 
 | 
	
		
			
				|  |  | +     *  @see http://java.sun.com/products/jndi/tutorial/ldap/connect/config.html
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private boolean connectionPoolEnabled = true;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    public InitialDirContext newInitialDirContext() throws DataAccessResourceFailureException {
 | 
	
		
			
				|  |  | +        Hashtable env = getEnvironment();
 | 
	
		
			
				|  |  | +        if (managerUser != null) {
 | 
	
		
			
				|  |  | +            env.put(Context.SECURITY_PRINCIPAL, managerUser);
 | 
	
		
			
				|  |  | +            env.put(Context.SECURITY_CREDENTIALS, managerPassword);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            return new InitialDirContext(env);
 | 
	
		
			
				|  |  | +        } catch (NamingException nx) {
 | 
	
		
			
				|  |  | +            throw new DataAccessResourceFailureException("Unable to connect to LDAP Server; check managerUser and managerPassword.", nx);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    /** 
 | 
	
		
			
				|  |  | +     * @return The Hashtable describing the base DirContext that will be created; minus the username/password if any.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    protected Hashtable getEnvironment() {
 | 
	
		
			
				|  |  | +        Hashtable env = new Hashtable(11);
 | 
	
		
			
				|  |  | +        env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
 | 
	
		
			
				|  |  | +        env.put(Context.PROVIDER_URL, URL);
 | 
	
		
			
				|  |  | +        env.put(Context.SECURITY_AUTHENTICATION, authenticationType);
 | 
	
		
			
				|  |  | +        if (connectionPoolEnabled) {
 | 
	
		
			
				|  |  | +            env.put("com.sun.jndi.ldap.connect.pool", "true");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if ((extraEnvVars != null) && (extraEnvVars.size() > 0)) {
 | 
	
		
			
				|  |  | +            env.putAll(extraEnvVars);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return env;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @return Returns the authenticationType.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public String getAuthenticationType() {
 | 
	
		
			
				|  |  | +        return authenticationType;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @param authenticationType The authenticationType to set.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void setAuthenticationType(String authenticationType) {
 | 
	
		
			
				|  |  | +        this.authenticationType = authenticationType;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @return Returns the initialContextFactory.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public String getInitialContextFactory() {
 | 
	
		
			
				|  |  | +        return initialContextFactory;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @param initialContextFactory The initialContextFactory to set.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void setInitialContextFactory(String initialContextFactory) {
 | 
	
		
			
				|  |  | +        this.initialContextFactory = initialContextFactory;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @return Returns the managerPassword.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public String getManagerPassword() {
 | 
	
		
			
				|  |  | +        return managerPassword;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @param managerPassword The managerPassword to set.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void setManagerPassword(String managerPassword) {
 | 
	
		
			
				|  |  | +        this.managerPassword = managerPassword;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @return Returns the managerUser.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public String getManagerUser() {
 | 
	
		
			
				|  |  | +        return managerUser;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @param managerUser The managerUser to set.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void setManagerUser(String managerUser) {
 | 
	
		
			
				|  |  | +        this.managerUser = managerUser;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @return Returns the uRL.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public String getURL() {
 | 
	
		
			
				|  |  | +        return URL;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @param url The uRL to set.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void setURL(String url) {
 | 
	
		
			
				|  |  | +        URL = url;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @return Allows extra environment variables to be added at config time.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public Map getExtraEnvVars() {
 | 
	
		
			
				|  |  | +        return extraEnvVars;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @param extraEnvVars Allows extra environment variables to be added at config time.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void setExtraEnvVars(Map extraEnvVars) {
 | 
	
		
			
				|  |  | +        this.extraEnvVars = extraEnvVars;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +}
 |