Я установил аутентификацию 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>