Spring-security создает некорректный ldap-запрос
Я пытаюсь заставить работать решение единой регистрации, которое ранее работало с Novell eDirectory в качестве LDAP-провайдера. Сейчас я пытаюсь заставить его работать с OpenLDAP. В процессе входа в систему одним из шагов является получение фактического пользователя из LDAP. Это сделано Spring-security, но, похоже, есть ошибка.
Для получения пользователя, LdapUserDetailsService#loadUserByUsername
называется. Это использует предопределенный LdapUserSearch
найти пользователя с данным именем пользователя. В моем случае конфигурация выглядит примерно так:
base:ou=something,ou=somethingElse,dc=oh,dc=my,dc=god
filter:cn={0}
где {0}
заменяется фактическим именем пользователя. Пока это работает, и пользователь извлекается в форме пользовательских данных, возвращаемых FilterBasedLdapUserSearch#searchForUser
, Но пользовательские данные не разделяются между dn и base, поэтому они имеют:
base: (empty)
dn:cn=someUsername,ou=something,ou=somethingElse,dc=oh,dc=my,dc=god
Этот объект userdata, в свою очередь, используется для получения прав доступа для пользователя, поэтому он пытается выполнить другой поиск, используя базу выше и dn как фильтр. Но этот запрос не выполняется, поскольку OpenLDAP не допускает никаких запросов с пустой строкой в качестве базы.
Я пытался с 3.1.3.RELEASE, 3.1.7.RELEASE и 3.2.7.RELEASE, все имеют одну и ту же проблему.
Это ошибка в весенней безопасности? Или я что-то здесь не так делаю?
1 ответ
Удалось исправить это, отойдя от "шаблонного" способа определения пользовательского сервиса ldap:
До:
<sec:ldap-user-service id="ldapUserDetailsService"
server-ref="contextSource"
user-search-filter="${my.ldap.filter}"
user-search-base="${my.ldap.base}"
user-context-mapper-ref="myUserDetailsContextMapper"/>
После:
<bean id="userSearch"
class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<constructor-arg index="0" value="${my.ldap.base}"/>
<constructor-arg index="1" value="${my.ldap.filter}"/>
<constructor-arg index="2" ref="contextSource"/>
</bean>
<bean id="ldapAuthoritiesPopulator" class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
<constructor-arg ref="contextSource"/>
<constructor-arg value="${my.ldap.usersearch.base}"/>
<property name="groupSearchFilter" value="${my.group.filter}" />
<property name="groupRoleAttribute" value="${my.group.attribute}" />
<property name="searchSubtree" value="true" />
</bean>
<bean id="ldapUserDetailsService" class="org.springframework.security.ldap.userdetails.LdapUserDetailsService">
<constructor-arg ref="userSearch"/>
<constructor-arg ref="ldapAuthoritiesPopulator"/>
</bean>
Не спрашивайте меня, как или почему это работает..