2017-01-18 18 views
0

Я пытаюсь создать приложение, в котором пользователи и группы будут управляться на сервере Apache Directory Server и его клиентском API.Как реализовать аутентификацию с помощью Apache Directory Server и Client Java API

Это пример файла Ldif выполняется на сервер, когда приложение начинает:

dn: o=koosserydesk objectclass: extensibleObject objectclass: top objectclass: domain dc: koosserydesk o: koosserydesk
dn: ou=desks,o=koosserydesk objectClass: organizationalUnit objectClass: top ou: desks
dn: ou=users,o=koosserydesk objectClass: organizationalUnit objectClass: top ou: users
dn: cn=John Milton,ou=users,o=koosserydesk objectClass: organizationalPerson objectClass: person objectClass: inetOrgPerson objectClass: top cn: John Milton sn: jmilton uid: jmilton userPassword:: e1NIQTUxMn1lQThmcUQzOVgva2xxSm1jOGlZK2JoWitUVFhzWElFRmZHeWJ1b

Я хочу, чтобы Джон Милтон признается в качестве аутентифицированного пользователя моего приложения когда он вводит соответствующий uid/userPassword. Что-то вроде:

Boolean authenticate(String uid){
//should i use connection.bind("uid="+uid, userPassword);??
return something; }

Обратите внимание, что Джон Милтон аутентифицируется против ApacheDS (для воздействия на записи) не является самым важным для меня. Я просто хочу, чтобы ApacheDs действовал как БД для моих пользователей, т. Е. возьмите uid моего пользователя, проверьте пароль, если он соответствует return true, либо верните false.
Возможно, это не так, как я должен попытаться справиться с этим, но я довольно новичок в протоколе Ldap и вещах вокруг, так что не удивляйтесь, не проблема ли моя проблема?
В ожидании предложений!

ответ

0

Это не может быть дубликатом, а второй ответ (Николай Антипов) на следующий вопрос может ответить на ваш вопрос: How to check user password in ldap whith java with given LdapContext?


Это решение, которое может использоваться для аутентификации пользователя с чем-то другим, кроме DN, например, с uid или sAMAccountName.

шаги, чтобы сделать это:

  1. Подключение к серверу LDAP
  2. Authenticate с пользователем службы которого мы знаем DN и учетные данные
  3. Поиск пользователя, которого вы хотите проверить подлинность, поиск его с некоторым атрибутом (например, sAMAccountName)
  4. Получить DN пользователя, которого мы нашли
  5. Открыть другое соединение с сервером LDAP с найденным DN и паролем
  6. Если пользователь найден и аутентификация работы, вы прекрасно

Пример кода:

public static boolean performAuthentication() { 

    // service user 
    String serviceUserDN = "cn=Mister Service,ou=Users,dc=example,dc=com"; 
    String serviceUserPassword = "abc123#!$"; 

    // user to authenticate 
    String identifyingAttribute = "uid"; 
    String identifier = "maxdev"; 
    String password = "jkl987.,-"; 
    String base = "ou=Users,dc=example,dc=com"; 

    // LDAP connection info 
    String ldap = "localhost"; 
    int port = 10389; 
    String ldapUrl = "ldap://" + ldap + ":" + port; 

    // first create the service context 
    DirContext serviceCtx = null; 
    try { 
     // use the service user to authenticate 
     Properties serviceEnv = new Properties(); 
     serviceEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     serviceEnv.put(Context.PROVIDER_URL, ldapUrl); 
     serviceEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     serviceEnv.put(Context.SECURITY_PRINCIPAL, serviceUserDN); 
     serviceEnv.put(Context.SECURITY_CREDENTIALS, serviceUserPassword); 
     serviceCtx = new InitialDirContext(serviceEnv); 

     // we don't need all attributes, just let it get the identifying one 
     String[] attributeFilter = { identifyingAttribute }; 
     SearchControls sc = new SearchControls(); 
     sc.setReturningAttributes(attributeFilter); 
     sc.setSearchScope(SearchControls.SUBTREE_SCOPE); 

     // use a search filter to find only the user we want to authenticate 
     String searchFilter = "(" + identifyingAttribute + "=" + identifier + ")"; 
     NamingEnumeration<SearchResult> results = serviceCtx.search(base, searchFilter, sc); 

     if (results.hasMore()) { 
      // get the users DN (distinguishedName) from the result 
      SearchResult result = results.next(); 
      String distinguishedName = result.getNameInNamespace(); 

      // attempt another authentication, now with the user 
      Properties authEnv = new Properties(); 
      authEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
      authEnv.put(Context.PROVIDER_URL, ldapUrl); 
      authEnv.put(Context.SECURITY_PRINCIPAL, distinguishedName); 
      authEnv.put(Context.SECURITY_CREDENTIALS, password); 
      new InitialDirContext(authEnv); 

      System.out.println("Authentication successful"); 
      return true; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (serviceCtx != null) { 
      try { 
       serviceCtx.close(); 
      } catch (NamingException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    System.err.println("Authentication failed"); 
    return false; 
} 
+0

Спасибо за шаги, чтобы сделать, я реализовал свой путь и решить мою проблему! –

 Смежные вопросы

  • Нет связанных вопросов^_^