Spring LDAP-bind для успешного подключения
Я пытаюсь аутентифицировать, а затем запросить наш корпоративный LDAP, используя Spring LDAP и Spring security. Мне удалось выполнить аутентификацию, но когда я пытаюсь запустить поиск, я всегда получаю следующее исключение
для выполнения этой операции необходимо выполнить успешную привязку соединения
после долгих исследований у меня есть теория, что после аутентификации и до того, как я могу запросить, мне нужно привязаться к соединению. Я просто не знаю что и как?
просто упомянуть-я могу успешно просматривать и искать наш LDAP с помощью JXplorer, поэтому мои параметры верны.
вот раздел моего securityContext.в XML
<security:http auto-config='true'>
<security:intercept-url pattern="/reports/goodbye.html"
access="ROLE_LOGOUT" />
<security:intercept-url pattern="/reports/**" access="ROLE_USER" />
<security:http-basic />
<security:logout logout-url="/reports/logout"
logout-success-url="/reports/goodbye.html" />
</security:http>
<security:ldap-server url="ldap://s140.foo.com:1389/dc=td,dc=foo,dc=com" />
<security:authentication-manager>
<security:authentication-provider ref="ldapAuthProvider">
</security:authentication-provider>
</security:authentication-manager>
<!-- Security beans -->
<bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="ldap://s140.foo.com:1389/dc=td,dc=foo,dc=com" />
</bean>
<bean id="ldapAuthProvider"
class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
<constructor-arg>
<bean class="foo.bar.reporting.server.security.ldap.LdapAuthenticatorImpl">
<property name="contextFactory" ref="contextSource" />
<property name="principalPrefix" value="TD" />
<property name="employee" ref="employee"></property>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="foo.bar.reporting.server.security.ldap.LdapAuthoritiesPopulator" />
</constructor-arg>
</bean>
<!-- DAOs -->
<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">
<constructor-arg ref="contextSource" />
вот фрагмент кода из LdapAuthenticatorImpl
выполняет проверку подлинности. Нет проблем здесь:
@Override
public DirContextOperations authenticate(final Authentication authentication) {
// Grab the username and password out of the authentication object.
final String name = authentication.getName();
final String principal = this.principalPrefix + name;
String password = "";
if (authentication.getCredentials() != null) {
password = authentication.getCredentials().toString();
}
if (!("".equals(principal.trim())) && !("".equals(password.trim()))) {
final InitialLdapContext ldapContext = (InitialLdapContext)
this.contextFactory.getContext(principal, password);
// We need to pass the context back out, so that the auth provider
// can add it to the Authentication object.
final DirContextOperations authAdapter = new DirContextAdapter();
authAdapter.addAttributeValue("ldapContext", ldapContext);
this.employee.setqId(name);
return authAdapter;
} else {
throw new BadCredentialsException("Blank username and/or password!");
}
}
и вот еще один фрагмент кода EmployeeDao
С моей тщетной попыткой спросить:
public List<Employee> queryEmployeesByName(String query)
throws BARServerException {
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("objectclass", "person"));
filter.and(new WhitespaceWildcardsFilter("cn", query));
try {
// the following line throws bind exception
List result = ldapTemplate.search(BASE, filter.encode(),
new AttributesMapper() {
@Override
public Employee mapFromAttributes(Attributes attrs)
throws NamingException {
Employee emp = new Employee((String) attrs.get("cn").get(),
(String) attrs.get("cn").get(),
(String) attrs.get("cn").get());
return emp;
}
});
return result;
} catch (Exception e) {
throw new BarServerException("Failed to query LDAP", e);
}
}
и, наконец, - за исключением Я получаю
org.springframework.ldap.UncategorizedLdapException:
Uncategorized exception occured during LDAP processing; nested exception is
javax.naming.NamingException: [LDAP: error code 1 - 00000000: LdapErr:
DSID-0C090627, comment: In order to perform this operation a successful bind
must be completed on the connection., data 0, vece]; remaining name
'DC=TD,DC=FOO,DC=COM'
3 ответов
похоже, что ваш LDAP настроен на запрещение поиска без привязки к нему (без анонимной привязки). Также вы реализовали PasswordComparisonAuthenticator
, а не BindAuthenticator
to аутентифицировать в LDAP.
вы можете попробовать изменить свой queryEmployeesByName()
метод привязки, а затем поиск, глядя на некоторые примеры в doc.
Я собираюсь принять ответ @Raghuram в основном потому, что он заставил меня думать в правильном направлении.
Почему мой код не успевает? Оказалось-как я его проводил, я пытался выполнить анонимный поиск, который запрещен системой-отсюда и ошибка.
как rewire пример выше, чтобы работать? Первое (и при этом уродливое), вам нужно предоставить имя пользователя и пароль пользователя, который будет использоваться для доступа к системе. Очень нелогично, даже когда вы входите и подлинности, даже если вы используете BindAuthenticator
система не будет пытаться повторно использовать ваши учетные данные. Лентяй. Поэтому вам нужно вставить 2 параметра в contextSource
определение вот так:
<bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="ldap://foo.com:389/dc=td,dc=foo,dc=com" />
<!-- TODO - need to hide this or encrypt a password -->
<property name="userDn" value="CN=admin,OU=Application,DC=TD,DC=FOO,DC=COM" />
<property name="password" value="blah" />
</bean>
Это позволило мне заменить пользовательскую реализацию authenticator на generic BindAuthenticator
и тогда мой поиск Java начал работать
Я получил ту же ошибку, не смог найти решение. Наконец, я изменил идентификатор пула приложений на сетевой сервис, и все работало как шарм. (У меня включена аутентификация windows и анонимность на моем сайте)