Ошибка аутентификации LDAP Spring Security - исключение аутентификации вместо блокировки пароля

Я установил аутентификацию ldap, используя следующую конфигурацию. Мне нужно, чтобы пользователь аутентифицировался с использованием хранилища данных LDAP, и в этом случае я установил для pwdMaxFailure значение 2.

Аутентификация работает правильно, однако каждый раз, когда я вхожу в систему с неправильным паролем, я получаю следующее исключение вместо исключения блокировки пароля. Я не думаю, что Spring LDAP проверяет PwdPolicy (подсчет попыток ввода пароля) при аутентификации пользователя.

ne = (javax.naming.AuthenticationException) javax.naming.AuthenticationException: [LDAP: код ошибки 49 - INVALID_CREDENTIALS: сбой привязки: ERR_229 Не удается аутентифицировать пользователя cn = admin, ou = users, o = organization]

Мой файл LDIF

dn: cn = admin, ou = users, o = организация objectClass: inetOrgPerson
objectClass: organizationPerson objectClass: person objectClass: top cn: admin sn: Admin uid: admin userPassword :: e1NTSEF9bEtlTUNzLy9OK1JsV2hCWEM2U2ZdZamp=ru: Z creatorsName: 0.9.2342.19200300.100.1.1 = admin, 2.5.4.11 = system entryCSN: 20141020004319.002000Z # 000000 # 001 # 000000 entryDN: cn = admin, ou = users, o = организация entryParentId: 8204b2df-ff5a-413a-a063 -4ac30d35bee4 entryUUID :: N2I1MTFlNjYtMDhjZS00YjA3LWIxYzItNTkyOTI3ZGE3ZTBi modifiersName: 0.9.2342.19200300.100.1.1 = админ, 2.5.4.11 = система modifyTimestamp: 20141020004319.002Z pwdFailureTime: 20141020003207.120Z pwdHistory :: MjAxNDEwMDMwMDAwMDguNjgxWiMxLjMuNi4xLjQuMS4xNDY2LjExNS4xMjEuMS4
0MCM4I1lXUnRhVzQ9 pwdPolicySubentry: сп = по умолчанию, НУ = pwdPolicy, о = организация

dn: cn = по умолчанию, ou = pwdPolicy, o = организация objectClass: устройство
objectClass: pwdPolicy objectClass: вверху cn: по умолчанию
pwdAttribute: userPassword pwdExpireWarning: 3600 pwdGraceExpire: 1 pwdLockout: TRUE pwdLockwduration: 2592 br> pwdMaxFailure: 2

И файл конфигурации пружины выглядит следующим образом

<authentication-manager alias="authenticationManager" xmlns="http://www.springframework.org/schema/security">
  <authentication-provider ref="jdbcProviderManager" />
  <authentication-provider ref="ldapProviderManager" />      
</authentication-manager>

<bean id="jdbcProviderManager" class="au.com.spring.handler.DBLoginAuthentication">
  <property name="userDetailsService" ref="daoAuthenticationProvider" />
</bean>

<bean id="ldapProviderManager" class="au.com.spring.handler.LDAPLoginAuthentication">
  <property name="userDetailsService" ref="ldapAuthenticationProvider" />
</bean>

<bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
  <property name="userDetailsService" ref="JdbcUserDetailsManager" />
  <property name="passwordEncoder" ref="encoder" />
</bean>

<bean id="ldapAuthenticationProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
  <constructor-arg>
    <bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
      <constructor-arg ref="contextSource" />
      <property name="userSearch" ref="ldapUserSearch" />
    </bean>
  </constructor-arg>
  <constructor-arg>
    <bean class="au.com.spring.handler.CustomLDAPAuthoritiesPopulator">
      <constructor-arg ref="contextSource" />
      <constructor-arg value="${group.search}" />
      <property name="groupSearchFilter" value="${group.search.filter}" />
      <property name="groupRoleAttribute" value="${group.role.att}" />
      <property name="rolePrefix" value="ROLE_" />
      <property name="searchSubtree" value="true" />
      <property name="convertToUpperCase" value="true" />
    </bean>
  </constructor-arg>
  <property name="hideUserNotFoundExceptions" value="false" />
  <property name="useAuthenticationRequestCredentials" value="true" />
  <property name="userDetailsContextMapper" ref="inetOrgPersonContextMapper" />
</bean>

<bean id="inetOrgPersonContextMapper" class="org.springframework.security.ldap.userdetails.InetOrgPersonContextMapper" />

<bean id="defaultLdapUsernameToDnMapper" class="org.springframework.security.ldap.DefaultLdapUsernameToDnMapper">
  <constructor-arg value="${users.search}" />
  <constructor-arg value="${uid.att}" />
</bean>
<!--<bean id="authenticationSuccessListener" class="prpa.athos.security.listener.AuthenticationSuccessListener" />-->

<!--<bean id="contextSource" class="org.springframework.security.ldap.ppolicy.PasswordPolicyAwareContextSource">-->
<bean id="contextSource" class="org.springframework.security.ldap.ppolicy.PasswordPolicyAwareContextSource">
  <constructor-arg value="ldap://localhost:10389/o=organization" />
  <!--<property name=""/>-->
</bean>


person Swathi    schedule 20.10.2014    source источник


Ответы (1)


Вместо исключения блокировки пароля я получаю следующее исключение.

Из проекта 10 политики паролей LDAP :

8.1.1. Ошибка, если учетная запись заблокирована

Если учетная запись заблокирована, как указано в разделе 7.1, сервер не выполняет операцию с соответствующим кодом результата (например, invalidCredentials (49) в случае операции привязки, compareFalse (5) в случае операции сравнения и т. Д.). Сервер МОЖЕТ установить ошибку: accountLocked (1) в passwordPolicyResponse в поле управления сообщения.

Значит, сервер LDAP ведет себя правильно.

Я не думаю, что Spring LDAP проверяет PwdPolicy (подсчет попыток ввода пароля) при аутентификации пользователя.

Проверку выполняет сервер LDAP. Spring потребуется предоставить дополнительный элемент управления запросами, который позволит ему видеть состояние блокировки паролем, описанное выше. Но в любом случае вы никогда не захотите раскрывать пользователю, почему его логин не удался во время входа в систему: это утечка информации. Это равносильно сообщению злоумышленнику о правильности имени пользователя, что нежелательно. Позвольте пользователю узнать, почему не удалось войти в систему, если он думает, что его пароль правильный, или позвольте ему пройти через последовательность утерянных паролей.

person user207421    schedule 20.10.2014
comment
Спасибо вам за быстрый ответ. После того, как логин не смог создать контекст (с использованием неправильного пароля), в блоке catch класса PasswordPolicyAwareContextSource он вызывает PasswordPolicyControlExtractor.extractControl, где responseControl имеет значение null. Если не null, проверяется, заблокирован ли ctrl. Не уверен, что я поступаю правильно, есть ли способ получить responseControl не null. - person Swathi; 20.10.2014
comment
Я ничего не знаю о Spring, но в LDAP вы должны прикрепить к запросу «элемент управления запросом политики паролей», чтобы получить «элемент управления ответом политики паролей» с ответом. - person user207421; 20.10.2014