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>

Не спрашивайте меня, как или почему это работает..

Другие вопросы по тегам