Играть в! Платформенная аутентификация с помощью LDAP

Я пишу веб-приложение с Play2 для Java и хочу использовать LDAP для аутентификации пользователей... Я новичок в LDAP и на самом деле не знаю точно, как это работает и как использовать его в Play...

на данный момент я нашел этот плагин, который, вероятно, должен помочь, но я не могу найти ни одного примера из них использует аутентификацию LDAP. Знаете ли вы какой-нибудь учебник, который мог бы помочь мне сделать первые шаги?

Я также наткнулся на этот пост в блоге, который выглядит хорошо, но не использует плагины аутентификации для игр, поэтому он может быть не таким гибким? http://www.philipp.haussleiter.de/2013/07/adding-ldap-authentication-to-a-play-2-application/


person behzad    schedule 17.02.2015    source источник


Ответы (1)


У меня есть пример аутентификации пользователя с использованием LDAP и игровой платформы. Вот код, надеюсь, это поможет

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"));

}
person Ubaidah    schedule 03.09.2015
comment
Спасибо большое, попробую на следующей неделе и буду держать вас в курсе - person behzad; 10.09.2015
comment
каково значение для domainName ? - person behzad; 30.12.2015
comment
@behzad — это доменное имя, которое вы используете при настройке Active Directory. например, это может быть foo.com или mycompany.ca - person Ubaidah; 30.12.2015
comment
Как насчет двух статических конечных строк account и pass ? Для чего они используются? - person SysHex; 26.02.2016
comment
@SysHex, я извлек приведенный выше код из более сложного приложения. Они вам не нужны. Я использовал их в других методах класса, но не в методе аутентификации. Я уберу их из ответа, спасибо! - person Ubaidah; 26.02.2016
comment
@Ubaidah Привет! У меня есть еще один вопрос, не могли бы вы объяснить мне, почему вы используете обещание? и почему вы используете плоскую карту? - person behzad; 17.11.2017
comment
@behzad хорошо, я думаю, что этот код устарел для текущей версии Play. Это было до Java8 :). Play App — это сервер с одним потоком, LDAP не обеспечивает асинхронные вызовы, поэтому я не хотел блокировать все приложение, и я думаю, что мне нужна плоская карта, чтобы отобразить результат обещания. - person Ubaidah; 17.11.2017
comment
@Ubaidah Спасибо за ответ, поправьте меня, если я ошибаюсь, InitialDirContext — это вызов синхронизации, поэтому он заблокирует приложение Play до тех пор, пока не будут получены результаты, а затем вы дадите обещание. У меня нет большого опыта работы с асинхронным кодированием, но в этом примере я думаю, что обещание не влияет на код. Было бы неплохо, если бы вы могли помочь мне понять это - person behzad; 17.11.2017
comment
@behzad stackoverflow.com/questions/30739043/ (см. этот вопрос и комментарий) - person Ubaidah; 17.11.2017
comment
@Ubaidah Привет! Я только что проверил это с помощью Thread.sleep, и это подтвердило мою точку зрения. вы запускаете InitialDirContext в своем основном потоке, и это функция, которая может заблокировать ваш код. поэтому, если я поставлю Thread.sleep перед return Promise.pure(Boolean.TRUE); , он по-прежнему блокирует выполнение. так что этот код не асинхронный. :) - person behzad; 20.11.2017
comment
@behzad Как вы узнали, что он блокирует выполнение? вам понадобится другой клиент для вызова другого API, например. x, и если x заблокирован для этого другого пользователя, то приложение ввода блокируется. Я также предлагаю вам рассмотреть возможность использования другого пула потоков playframework.com/documentation/2.6.x/ Пулы потоков - person Ubaidah; 20.11.2017