Spring LDAP аутентификация без использования учетной записи администратора / администратора - PullRequest
2 голосов
/ 09 февраля 2012

Мое требование состоит в том, чтобы аутентифицировать логин пользователя (имя пользователя и пароль) для доступа к веб-приложению.

Используя Java, я смог аутентифицироваться, используя предоставленный пользователем логин:

boolean isCredentialsValid = false;

Hashtable env = new Hashtable();        
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapUrl);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);

try {
 DirContext ctx = new InitialDirContext(env);
 ctx.close();
 isCredentialsValid = true;
} catch (Exception e) {
 e.printStackTrace(); 
}

System.out.println(isCredentialsValid);

Может ли это быть реализовано непосредственно в Spring?Как использовать BindAuthenticator или PasswordComparisonAuthenticator?Я попытался использовать эту конфигурацию:

<bean id="contextSource"
 class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
   <constructor-arg value="IP of LDAP Server:389" />
</bean>

<bean id="ldapAuthenticator"
 class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator">
  <constructor-arg ref="contextSource"/>
  <property name="userDNPatterns" >
  <list>
   <value>uid={0}, dc=company,dc=com</value>
  </list>
  </property>
</bean>

<bean id="userSearch"
 class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
  <constructor-arg index="0" value="ou=people" />
  <constructor-arg index="1" value="(uid={0})" />
  <constructor-arg index="2" ref="contextSource" />
  <property name="searchSubtree" value="true" />
</bean>

Но я приветствую исключение UncategorizedLdapException.

Из того, что я прочитал в Spring LDAP, я не могу напрямую аутентифицировать логин пользователя без предоставления учетной записи администратора.

Любая помощь очень ценится!

Это трассировка стека:

Во время обработки LDAP возникло исключение без категории;вложенным исключением является javax.naming.NamingException: [LDAP: код ошибки 1 - 000004DC: LdapErr: DSID-0C0906DC, комментарий: для выполнения этой операции необходимо выполнить успешное связывание для соединения., данные 0, v1db0];оставшееся имя 'uid=username@company.com';вложенным исключением является org.springframework.ldap.UncategorizedLdapException: исключение без категории во время обработки LDAP;вложенным исключением является javax.naming.NamingException: [LDAP: код ошибки 1 - 000004DC: LdapErr: DSID-0C0906DC, комментарий: для выполнения этой операции необходимо выполнить успешное связывание для соединения., данные 0, v1db0];оставшееся имя 'uid=username@company.com'

Ответы [ 3 ]

1 голос
/ 13 декабря 2012

LdapTemplate (spring-ldap-core 1.3.1RELEASE) бесполезен в этом сценарии (к сожалению, я считаю, что он бесполезен и для других) - поскольку метод LdapTemplate.authenticate (...) выполняет поиск, что, очевидно, не может быть завершено без успешного связывания в первую очередь.

Я адаптировал ту же концепцию, что и в ActiveDirectoryLdapAuthenticationProvider:

  1. Аутентификация по LDAP старым способом

    private static DirContext bindAsUser(String username, String password) {
      final String bindUrl = url;
    
      Hashtable<String, String> env = new Hashtable<String, String>();
      env.put(Context.SECURITY_AUTHENTICATION, "simple");
      String bindPrincipal = username;
      env.put(Context.SECURITY_PRINCIPAL, bindPrincipal);
      env.put(Context.PROVIDER_URL, bindUrl);
      env.put(Context.SECURITY_CREDENTIALS, password);
      env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    
      try {
        return contextFactory.createContext(env);
      } catch (NamingException e) {
        throw new RuntimeException(e);
      }
    }  
    
  2. Использование SpringSecurityLdapTemplate для запроса LDAP

Еще одна проблема с ядром spring-ldap-core 1.3.1RELEASE, я не могупонять, почему он не был объединен с spring-security-ldap: 3.1.

1 голос
/ 09 февраля 2012

Если это для Windows Active Directory, попробуйте Spring ActiveDirectoryLdapAuthenticationProvider.

0 голосов
/ 14 февраля 2012

Вы пробовали модуль JAAS для ldap (com.sun.security.auth.module.LdapLoginModule)?

...