Author: rgodfrey
Date: Fri May 18 20:54:25 2012
New Revision: 1340248

URL: http://svn.apache.org/viewvc?rev=1340248&view=rev
Log:
QPID-4010 : [Java broker] Add LDAP authentication

Added:
    
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java
      - copied, changed from r1340158, 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/KerberosAuthenticationManager.java
Modified:
    
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugins/PluginManager.java
    
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/KerberosAuthenticationManager.java

Modified: 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugins/PluginManager.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugins/PluginManager.java?rev=1340248&r1=1340247&r2=1340248&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugins/PluginManager.java
 (original)
+++ 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugins/PluginManager.java
 Fri May 18 20:54:25 2012
@@ -24,6 +24,7 @@ import org.apache.felix.framework.util.S
 import org.apache.log4j.Logger;
 import 
org.apache.qpid.server.security.auth.manager.AnonymousAuthenticationManager;
 import 
org.apache.qpid.server.security.auth.manager.KerberosAuthenticationManager;
+import 
org.apache.qpid.server.security.auth.manager.SimpleLDAPAuthenticationManager;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
@@ -160,7 +161,8 @@ public class PluginManager implements Cl
                 new SlowConsumerDetectionQueueConfigurationFactory(),
                 
PrincipalDatabaseAuthenticationManager.PrincipalDatabaseAuthenticationManagerConfiguration.FACTORY,
                 
AnonymousAuthenticationManager.AnonymousAuthenticationManagerConfiguration.FACTORY,
-                
KerberosAuthenticationManager.KerberosAuthenticationManagerConfiguration.FACTORY))
+                
KerberosAuthenticationManager.KerberosAuthenticationManagerConfiguration.FACTORY,
+                
SimpleLDAPAuthenticationManager.SimpleLDAPAuthenticationManagerConfiguration.FACTORY))
         {
             _configPlugins.put(configFactory.getParentPaths(), configFactory);
         }
@@ -177,7 +179,7 @@ public class PluginManager implements Cl
 
         for (AuthenticationManagerPluginFactory<? extends Plugin> 
pluginFactory : Arrays.asList(
                 PrincipalDatabaseAuthenticationManager.FACTORY, 
AnonymousAuthenticationManager.FACTORY,
-                KerberosAuthenticationManager.FACTORY))
+                KerberosAuthenticationManager.FACTORY, 
SimpleLDAPAuthenticationManager.FACTORY))
         {
             _authenticationManagerPlugins.put(pluginFactory.getPluginName(), 
pluginFactory);
         }

Modified: 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/KerberosAuthenticationManager.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/KerberosAuthenticationManager.java?rev=1340248&r1=1340247&r2=1340248&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/KerberosAuthenticationManager.java
 (original)
+++ 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/KerberosAuthenticationManager.java
 Fri May 18 20:54:25 2012
@@ -132,7 +132,7 @@ public class KerberosAuthenticationManag
         {
             try
             {
-            return Sasl.createSaslServer(GSSAPI_MECHANISM, "AMQP", "scrumpy",
+            return Sasl.createSaslServer(GSSAPI_MECHANISM, "AMQP", localFQDN,
                                          new HashMap<String, Object>(), 
_callbackHandler);
             }
             catch (SaslException e)

Copied: 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java
 (from r1340158, 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/KerberosAuthenticationManager.java)
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java?p2=qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java&p1=qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/KerberosAuthenticationManager.java&r1=1340158&r2=1340248&rev=1340248&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/KerberosAuthenticationManager.java
 (original)
+++ 
qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java
 Fri May 18 20:54:25 2012
@@ -16,15 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.qpid.server.security.auth.manager;
 
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.List;
+import javax.naming.Context;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
 import javax.security.auth.Subject;
 import javax.security.auth.callback.Callback;
 import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
 import javax.security.auth.callback.UnsupportedCallbackException;
 import javax.security.sasl.AuthorizeCallback;
 import javax.security.sasl.Sasl;
@@ -37,15 +47,21 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.configuration.plugins.ConfigurationPluginFactory;
 import org.apache.qpid.server.security.auth.AuthenticationResult;
 import org.apache.qpid.server.security.auth.sasl.UsernamePrincipal;
+import org.apache.qpid.server.security.auth.sasl.plain.PlainPasswordCallback;
 
-public class KerberosAuthenticationManager implements AuthenticationManager
+public class SimpleLDAPAuthenticationManager implements AuthenticationManager
 {
-    private static final Logger _logger = 
Logger.getLogger(KerberosAuthenticationManager.class);
+    private static final Logger _logger = 
Logger.getLogger(SimpleLDAPAuthenticationManager.class);
 
-    private static final String GSSAPI_MECHANISM = "GSSAPI";
-    private final CallbackHandler _callbackHandler = new 
GssApiCallbackHandler();
+    private static final String PLAIN_MECHANISM = "PLAIN";
+    private static final String DEFAULT_LDAP_CONTEXT_FACTORY = 
"com.sun.jndi.ldap.LdapCtxFactory";
+    private String _providerSearchURL;
+    private String _searchContext;
+    private String _searchFilter;
+    private String _providerAuthURL;
+    private String _ldapContextFactory;
 
-    public static class KerberosAuthenticationManagerConfiguration extends 
ConfigurationPlugin
+    public static class SimpleLDAPAuthenticationManagerConfiguration extends 
ConfigurationPlugin
     {
 
         public static final ConfigurationPluginFactory FACTORY =
@@ -53,63 +69,101 @@ public class KerberosAuthenticationManag
                 {
                     public List<String> getParentPaths()
                     {
-                        return Arrays.asList("security.kerberos-auth-manager");
+                        return 
Arrays.asList("security.simple-ldap-auth-manager");
                     }
 
                     public ConfigurationPlugin newInstance(final String path, 
final Configuration config) throws ConfigurationException
                     {
-                        final ConfigurationPlugin instance = new 
KerberosAuthenticationManagerConfiguration();
+                        final ConfigurationPlugin instance = new 
SimpleLDAPAuthenticationManagerConfiguration();
 
                         instance.setConfiguration(path, config);
                         return instance;
                     }
                 };
 
+        private static final String PROVIDER_URL = "provider-url";
+        private static final String PROVIDER_SEARCH_URL = 
"provider-search-url";
+        private static final String PROVIDER_AUTH_URL = "provider-auth-url";
+        private static final String SEARCH_CONTEXT = "search-context";
+        private static final String SEARCH_FILTER = "search-filter";
+        private static final String LDAP_CONTEXT_FACTORY = 
"ldap-context-factory";
+
         public String[] getElementsProcessed()
         {
-            return new String[0];
+            return new String[] {PROVIDER_URL, PROVIDER_SEARCH_URL, 
PROVIDER_AUTH_URL, SEARCH_CONTEXT, SEARCH_FILTER,
+                                 LDAP_CONTEXT_FACTORY};
         }
 
         public void validateConfiguration() throws ConfigurationException
         {
         }
 
+        public String getLDAPContextFactory()
+        {
+            return getConfig().getString(LDAP_CONTEXT_FACTORY, 
DEFAULT_LDAP_CONTEXT_FACTORY);
+        }
+
+
+        public String getProviderURL()
+        {
+            return getConfig().getString(PROVIDER_URL);
+        }
+
+        public String getProviderSearchURL()
+        {
+            return getConfig().getString(PROVIDER_SEARCH_URL, 
getProviderURL());
+        }
+
+        public String getSearchContext()
+        {
+            return getConfig().getString(SEARCH_CONTEXT);
+        }
+
+        public String getSearchFilter()
+        {
+            return getConfig().getString(SEARCH_FILTER);
+        }
+
+        public String getProviderAuthURL()
+        {
+            return getConfig().getString(PROVIDER_AUTH_URL, getProviderURL());
+        }
     }
 
 
-    public static final 
AuthenticationManagerPluginFactory<KerberosAuthenticationManager> FACTORY = new 
AuthenticationManagerPluginFactory<KerberosAuthenticationManager>()
+    public static final 
AuthenticationManagerPluginFactory<SimpleLDAPAuthenticationManager> FACTORY = 
new AuthenticationManagerPluginFactory<SimpleLDAPAuthenticationManager>()
     {
-        public KerberosAuthenticationManager newInstance(final 
ConfigurationPlugin config) throws ConfigurationException
+        public SimpleLDAPAuthenticationManager newInstance(final 
ConfigurationPlugin config) throws ConfigurationException
         {
-            KerberosAuthenticationManagerConfiguration configuration =
+            SimpleLDAPAuthenticationManagerConfiguration configuration =
                     config == null
                             ? null
-                            : (KerberosAuthenticationManagerConfiguration) 
config.getConfiguration(KerberosAuthenticationManagerConfiguration.class.getName());
+                            : (SimpleLDAPAuthenticationManagerConfiguration) 
config.getConfiguration(SimpleLDAPAuthenticationManagerConfiguration.class.getName());
 
             // If there is no configuration for this plugin then don't load it.
             if (configuration == null)
             {
-                _logger.info("No authentication-manager configuration found 
for AnonymousAuthenticationManager");
+                _logger.info("No authentication-manager configuration found 
for SimpleLDAPAuthenticationManager");
                 return null;
             }
-            KerberosAuthenticationManager kerberosAuthenticationManager = new 
KerberosAuthenticationManager();
-            kerberosAuthenticationManager.configure(configuration);
-            return kerberosAuthenticationManager;
+            SimpleLDAPAuthenticationManager simpleLDAPAuthenticationManager = 
new SimpleLDAPAuthenticationManager();
+            simpleLDAPAuthenticationManager.configure(configuration);
+            return simpleLDAPAuthenticationManager;
         }
 
-        public Class<KerberosAuthenticationManager> getPluginClass()
+        public Class<SimpleLDAPAuthenticationManager> getPluginClass()
         {
-            return KerberosAuthenticationManager.class;
+            return SimpleLDAPAuthenticationManager.class;
         }
 
         public String getPluginName()
         {
-            return KerberosAuthenticationManager.class.getName();
+            return SimpleLDAPAuthenticationManager.class.getName();
         }
     };
 
 
-    private KerberosAuthenticationManager()
+    private SimpleLDAPAuthenticationManager()
     {
     }
 
@@ -122,24 +176,17 @@ public class KerberosAuthenticationManag
     @Override
     public String getMechanisms()
     {
-        return GSSAPI_MECHANISM;
+        return PLAIN_MECHANISM;
     }
 
     @Override
     public SaslServer createSaslServer(String mechanism, String localFQDN) 
throws SaslException
     {
-        if(GSSAPI_MECHANISM.equals(mechanism))
+        if(PLAIN_MECHANISM.equals(mechanism))
         {
-            try
-            {
-            return Sasl.createSaslServer(GSSAPI_MECHANISM, "AMQP", "scrumpy",
-                                         new HashMap<String, Object>(), 
_callbackHandler);
-            }
-            catch (SaslException e)
-            {
-                e.printStackTrace(System.err);
-                throw e;
-            }
+            return Sasl.createSaslServer(PLAIN_MECHANISM, "AMQP", localFQDN,
+                                     new HashMap<String, Object>(), new 
PlainCallbackHandler());
+
         }
         else
         {
@@ -169,7 +216,6 @@ public class KerberosAuthenticationManag
         }
         catch (SaslException e)
         {
-            e.printStackTrace(System.err);
             return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
         }
     }
@@ -177,15 +223,42 @@ public class KerberosAuthenticationManag
     @Override
     public AuthenticationResult authenticate(String username, String password)
     {
-        return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR);
+
+        try
+        {
+            return doLDAPNameAuthentication(getNameFromId(username), password);
+        }
+        catch (NamingException e)
+        {
+
+            return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
+
+        }
+    }
+
+    private AuthenticationResult doLDAPNameAuthentication(String username, 
String password) throws NamingException
+    {
+        Hashtable<Object,Object> env = new Hashtable<Object,Object>();
+        env.put(Context.INITIAL_CONTEXT_FACTORY, _ldapContextFactory);
+        env.put(Context.PROVIDER_URL, _providerAuthURL);
+
+        env.put(Context.SECURITY_AUTHENTICATION, "simple");
+
+        env.put(Context.SECURITY_PRINCIPAL, username);
+        env.put(Context.SECURITY_CREDENTIALS, password);
+        DirContext ctx = new InitialDirContext(env);
+        ctx.close();
+        final Subject subject = new Subject();
+        subject.getPrincipals().add(new UsernamePrincipal(username));
+        return new AuthenticationResult(subject);
     }
 
     @Override
     public CallbackHandler getHandler(String mechanism)
     {
-        if(GSSAPI_MECHANISM.equals(mechanism))
+        if(PLAIN_MECHANISM.equals(mechanism))
         {
-            return _callbackHandler;
+            return new PlainCallbackHandler();
         }
         else
         {
@@ -201,19 +274,86 @@ public class KerberosAuthenticationManag
     @Override
     public void configure(ConfigurationPlugin config) throws 
ConfigurationException
     {
+        SimpleLDAPAuthenticationManagerConfiguration ldapConfig = 
(SimpleLDAPAuthenticationManagerConfiguration) config;
+
+        _ldapContextFactory = ldapConfig.getLDAPContextFactory();
+        _providerSearchURL = ldapConfig.getProviderSearchURL();
+        _providerAuthURL = ldapConfig.getProviderAuthURL();
+        _searchContext = ldapConfig.getSearchContext();
+        _searchFilter = ldapConfig.getSearchFilter();
+
+        Hashtable<String,Object> env = new Hashtable<String, Object>();
+        env.put(Context.INITIAL_CONTEXT_FACTORY, _ldapContextFactory);
+        env.put(Context.PROVIDER_URL, _providerSearchURL);
+        env.put(Context.SECURITY_AUTHENTICATION, "none");
+
+        try
+        {
+            new InitialDirContext(env);
+        }
+        catch (NamingException e)
+        {
+            throw new ConfigurationException("Unable to establish anonymous 
connection to the ldap server at " + _providerSearchURL, e);
+        }
     }
 
-    private static class GssApiCallbackHandler implements CallbackHandler
+    private class PlainCallbackHandler implements CallbackHandler
     {
 
         @Override
         public void handle(Callback[] callbacks) throws IOException, 
UnsupportedCallbackException
         {
+            String name = null;
+            String password = null;
+            AuthenticationResult authenticated = null;
             for(Callback callback : callbacks)
             {
-                if (callback instanceof AuthorizeCallback)
+                if (callback instanceof NameCallback)
+                {
+                    String id = ((NameCallback) callback).getDefaultName();
+                    try
+                    {
+                        name = getNameFromId(id);
+                    }
+                    catch (NamingException e)
+                    {
+                        _logger.info("SASL Authentication Error", e);
+                    }
+                    if(password != null)
+                    {
+                        try
+                        {
+                            authenticated = doLDAPNameAuthentication(name, 
password);
+
+                        }
+                        catch (NamingException e)
+                        {
+                            authenticated = new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
+                        }
+                    }
+                }
+                else if (callback instanceof PlainPasswordCallback)
+                {
+                    password = 
((PlainPasswordCallback)callback).getPlainPassword();
+                    if(name != null)
+                    {
+                        try
+                        {
+                            authenticated = doLDAPNameAuthentication(name, 
password);
+                            if(authenticated.getStatus()== 
AuthenticationResult.AuthenticationStatus.SUCCESS)
+                            {
+                                
((PlainPasswordCallback)callback).setAuthenticated(true);
+                            }
+                        }
+                        catch (NamingException e)
+                        {
+                            authenticated = new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
+                        }
+                    }
+                }
+                else if (callback instanceof AuthorizeCallback)
                 {
-                    ((AuthorizeCallback) callback).setAuthorized(true);
+                    ((AuthorizeCallback) callback).setAuthorized(authenticated 
!= null && authenticated.getStatus() == 
AuthenticationResult.AuthenticationStatus.SUCCESS);
                 }
                 else
                 {
@@ -222,4 +362,40 @@ public class KerberosAuthenticationManag
             }
         }
     }
+
+    private String getNameFromId(String id) throws NamingException
+    {
+        Hashtable<Object,Object> env = new Hashtable<Object,Object>();
+        env.put(Context.INITIAL_CONTEXT_FACTORY, _ldapContextFactory);
+        env.put(Context.PROVIDER_URL, _providerSearchURL);
+
+
+        env.put(Context.SECURITY_AUTHENTICATION, "none");
+        DirContext ctx = null;
+
+        ctx = new InitialDirContext(env);
+
+        try
+        {
+            SearchControls searchControls = new SearchControls();
+            searchControls.setReturningAttributes(new String[] {});
+            searchControls.setCountLimit(1l);
+            searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+            NamingEnumeration<?> namingEnum = null;
+            String name = null;
+
+            namingEnum = ctx.search(_searchContext, _searchFilter, new 
String[] { id }, searchControls);
+            if(namingEnum.hasMore())
+            {
+                SearchResult result = (SearchResult) namingEnum.next();
+                name = result.getNameInNamespace();
+            }
+            return name;
+        }
+        finally
+        {
+            ctx.close();
+        }
+
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to