ОК, так как я потратил много времени на решение этого, вот ответ.
Код ошибки 2030 означает, что DN пользователя является недействительным.
После некоторой проб и ошибок здесьКонфиг, который работает и выполняет поиск пользователя правильно.(Возможно, вы можете переписать это, используя пространство имен безопасности, но пока я работал над этим, было более понятно использовать необработанные определения bean-компонентов).
<bean id="contextSource"
class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="ldap://localhost:389/cn=Sandbox,dc=ITOrg"/>
<property name="userDn" value="cn=superuser,cn=People,cn=Sandbox,dc=ITOrg"/>
<property name="password" value="xxxxxx"/>
</bean>
<bean id="ldapAuthProvider"
class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
<constructor-arg>
<bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
<constructor-arg ref="contextSource"/>
<property name="userDnPatterns">
<list>
<value>cn={0},cn=People</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
<bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<constructor-arg index="0" value="cn=People"/>
<constructor-arg index="1" value="(cn={0})"/>
<constructor-arg index="2" ref="contextSource"/>
</bean>
Ключевые вещи
<property name="userDn" value="cn=superuser,cn=People,cn=Sandbox,dc=ITOrg"/>
При указании userDn в источнике контекста это должен быть FULL DN (он не просто добавляет, а делает базу, указанную в url (конструктор arg).
При использовании BindAuthentication
<value>cn={0},cn=People</value>
Это значение является суффиксом над baseDn источника контекста.
При настройке пользовательского поиска
<constructor-arg index="0" value="cn=People"/>
<constructor-arg index="1" value="(cn={0})"/>
Я не смог заставить его работать с cn=People
ввторой аргумент, но это, кажется, работает нормально. Обратите внимание, что вы можете использовать атрибуты пользователя, например (uid={0})
А вот пример кода, использующего определения bean-компонентов ...
@Autowired
private LdapUserSearch ldapUserSearch;
@Autowired
private AuthenticationProvider authenticationProvider;
public void initialise()
{
DirContextOperations dirContextOperations = ldapUserSearch.searchForUser( "username" );
Authentication authentication = authenticationProvider.authenticate( new UsernamePasswordAuthenticationToken( "username", "password" ) );
}
Некоторыедругие случайные сиськи ...
Error 52b - Invalid password
[LDAP: error code 32 - 0000208D: NameErr: DSID-031521D2, problem 2001 (NO_OBJECT), data 0, best match of: 'CN=Sandbox,DC=ITOrg'
- This means the user is not in the administrator role (probably)
Надеюсь, все это поможет кому-то еще.