使用LDAP进行Play!框架身份验证

7
我正在使用Play2 for Java编写webApp,并希望使用LDAP进行用户身份验证...我还不熟悉LDAP的工作原理以及如何在Play中使用它...
目前,我找到了这个插件,https://github.com/joscha/play-authenticate,应该可以解决我的问题,但我无法找到任何使用LDAP身份验证的示例。您是否知道任何教程可以帮助我迈出第一步?
我也找到了这篇博客文章http://www.philipp.haussleiter.de/2013/07/adding-ldap-authentication-to-a-play-2-application/,看起来不错,但没有使用play身份验证插件,因此可能不太灵活?
1个回答

5

我有一个使用LDAP和Play框架进行用户身份验证的示例。以下是代码,希望这能帮助您:

public class ActiveDirectoryServices {

  public static final String ldapURL = Play.application().configuration().getString("ActiveDirectory.url");
  public static final String domainName =   Play.application().configuration().getString("ActoveDirectory.DomainName");
  public static final int timeout =         Play.application().configuration().getInt("ActoveDirectory.timeout");

  public static Promise<Boolean> authenticate(String username, String password) throws AuthenticationException, CommunicationException, NamingException{

     Hashtable<String, String> env = new Hashtable<String,String>();     

     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
     env.put("com.sun.jndi.ldap.connect.timeout", ""+(timeout*1000));
     env.put(Context.PROVIDER_URL, ldapURL);
     env.put(Context.SECURITY_AUTHENTICATION, "simple");
     env.put(Context.SECURITY_PRINCIPAL, username+domainName);
     env.put(Context.SECURITY_CREDENTIALS, password);

     DirContext authContext = null; 
     authContext = new InitialDirContext(env);        
     return Promise.pure(Boolean.TRUE);                         
   }

}

然后在控制器中,我按照以下方式使用上述代码:
try {

    Promise<Boolean> promiseActiveDirectoryCheck = ActiveDirectoryServices.authenticate(userName, password);
      return promiseActiveDirectoryCheck.flatMap(response -> {

      if(response){                           
        return Promise.pure(ok("access granted"));
      }


  });

}catch (AuthenticationException exp) {
  return Promise.pure(ok("access denied"));

}catch (CommunicationException exp) {
  return Promise.pure(ok("The active directory server is not reachable"));

}catch (NamingException exp) {
  return Promise.pure(ok("active directory domain name does not exist"));

}

非常感谢,我下周会尝试并保持您的知情。 - behzad
域名的值是什么? - behzad
那么这两个静态不可变字符串 account 和 pass 呢?它们有什么用途? - SysHex
@Ubaidah 感谢您的回复,如果我错了,请纠正我,InitialDirContext 是一个同步调用,因此它会阻塞 Play 应用程序直到结果返回,然后您才能创建一个 Promise。我对异步编码没有太多经验,但在这个例子中,我认为 Promise 不会影响代码。如果您能帮助我理解它,那就太好了。 - behzad
1
@Ubaidah 你好!我刚刚使用Thread.sleep检查了一下,证明了我的观点。你在主线程中运行InitialDirContext函数,它是可以阻塞你的代码的函数。所以,如果我在"return Promise.pure(Boolean.TRUE);"之前加上Thread.sleep,它仍然会阻塞执行。因此,这段代码不是异步的。 :) - behzad
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接