|
@@ -0,0 +1,222 @@
|
|
|
|
+package net.sf.acegisecurity.providers.dao.ldap;
|
|
|
|
+
|
|
|
|
+import java.util.Hashtable;
|
|
|
|
+import java.util.Map;
|
|
|
|
+
|
|
|
|
+import javax.naming.AuthenticationException;
|
|
|
|
+import javax.naming.Context;
|
|
|
|
+import javax.naming.NamingException;
|
|
|
|
+import javax.naming.directory.InitialDirContext;
|
|
|
|
+import org.springframework.dao.DataAccessResourceFailureException;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Convient base class and/or bean which can be used to create DirContext objects.
|
|
|
|
+ * Many user's will only need to set to Url property.
|
|
|
|
+ *
|
|
|
|
+ * <p>
|
|
|
|
+ * Eample: <br/>
|
|
|
|
+ * <bean id="initialDirContextFactoryBean"
|
|
|
|
+ * class="net.sf.acegisecurity.providers.dao.ldap.InitialDirContextFactoryBean"> <br/>
|
|
|
|
+ * <property name="url"><value>ldap://myserver.com:389/</value></property> <br/>
|
|
|
|
+ * <property name="managerUser"><value>cn=UserWithSearchPermissions,dc=mycompany,dc=com</value></property> <br/>
|
|
|
|
+ * <property name="managerPassword"><value>PasswordForUser</value></property> <br/>
|
|
|
|
+ * </bean> <br/>
|
|
|
|
+ * </p>
|
|
|
|
+ *
|
|
|
|
+ *
|
|
|
|
+ * @see http://java.sun.com/products/jndi/tutorial/ldap/connect/config.html
|
|
|
|
+ *
|
|
|
|
+ * @author robert.sanders
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+public class InitialDirContextFactoryBean {
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * LDAP URL (with or without the port) of the LDAP server to connect to.
|
|
|
|
+ * <p>Example: <br/>
|
|
|
|
+ * <b>ldap://dir.mycompany.com:389/dc=mycompany,dc=com</b> <br/>
|
|
|
|
+ * <small>(port 389 is the standard LDAP port). </small>
|
|
|
|
+ * </p>
|
|
|
|
+ */
|
|
|
|
+ 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(String username, String password) throws AuthenticationException, DataAccessResourceFailureException {
|
|
|
|
+ Hashtable env = getEnvironment();
|
|
|
|
+ if (null != username) {
|
|
|
|
+ env.put(Context.SECURITY_PRINCIPAL, username);
|
|
|
|
+ }
|
|
|
|
+ if (null != password) {
|
|
|
|
+ env.put(Context.SECURITY_CREDENTIALS, password);
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ return new InitialDirContext(env);
|
|
|
|
+ } catch (AuthenticationException ax) {
|
|
|
|
+ throw ax; // just pass it right on.
|
|
|
|
+ } catch (NamingException nx) {
|
|
|
|
+ // any other JNDI exception:
|
|
|
|
+ throw new DataAccessResourceFailureException("Unable to connect to LDAP Server; check managerUser and managerPassword.", nx);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /** Returns a new InitialDirContext using the provided managerUser and managerPassword (if provided) as credentials.
|
|
|
|
+ * @throws AuthenticationException */
|
|
|
|
+ public InitialDirContext newInitialDirContext() throws DataAccessResourceFailureException, AuthenticationException {
|
|
|
|
+ return newInitialDirContext(managerUser, managerPassword);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @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 Password (if any) of the user named by the managerUser property.
|
|
|
|
+ */
|
|
|
|
+ public String getManagerPassword() {
|
|
|
|
+ return managerPassword;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @param managerPassword Password (if any) of the user named by the managerUser property.
|
|
|
|
+ */
|
|
|
|
+ public void setManagerPassword(String managerPassword) {
|
|
|
|
+ this.managerPassword = managerPassword;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @return Name of the user (typically a fully qualified DN) which
|
|
|
|
+ * will be used to authenticate with the LDAP server when initiating LDAP connections.
|
|
|
|
+ */
|
|
|
|
+ public String getManagerUser() {
|
|
|
|
+ return managerUser;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * For OpenLDAP this might be "cn=Manager,dc=mycompany,dc=com";
|
|
|
|
+ * because this user typically <b>only</b> needs to be able to search/read
|
|
|
|
+ * the contexts against which LDAP operations occur, you may wish
|
|
|
|
+ * to create an account with read-only settings for this purpose.
|
|
|
|
+ * <p>
|
|
|
|
+ * If this property is not set, then the default behavor is
|
|
|
|
+ * to connect to the LDAP server anonymously.
|
|
|
|
+ * </p>
|
|
|
|
+ *
|
|
|
|
+ *
|
|
|
|
+ * @param managerUser Name of the user (typically a fully qualified DN) which
|
|
|
|
+ * will be used to authenticate with the LDAP server when initiating LDAP connections.
|
|
|
|
+ */
|
|
|
|
+ public void setManagerUser(String managerUser) {
|
|
|
|
+ this.managerUser = managerUser;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @return The URL of the LDAP host to connect to, including port (if non-default),
|
|
|
|
+ * and the base DN from which other operations will be relative to.
|
|
|
|
+ */
|
|
|
|
+ public String getUrl() {
|
|
|
|
+ return url;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * LDAP URL (with or without the port) of the LDAP server to connect to.
|
|
|
|
+ * <p>Example: <br/>
|
|
|
|
+ * <b>ldap://dir.mycompany.com:389/dc=mycompany,dc=com</b> <br/>
|
|
|
|
+ * <small>(port 389 is the standard LDAP port) </small> so the example above could also be: <br/>
|
|
|
|
+ * <b>ldap://dir.mycompany.com/dc=mycompany,dc=com</b> <br/>
|
|
|
|
+ * </p>
|
|
|
|
+ *
|
|
|
|
+ *
|
|
|
|
+ * @param url The URL of the LDAP host to connect to, including port (if non-default),
|
|
|
|
+ * and the base DN from which other operations will be relative to.
|
|
|
|
+ */
|
|
|
|
+ public void setUrl(String url) {
|
|
|
|
+ this.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;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|