次の構成を使用して 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=organisation を認証できません]
私のLDIFファイルは
dn: cn=admin,ou=users,o=organization objectClass: inetOrgPerson
objectClass: organizationalPerson objectClass: person objectClass: top cn: admin sn: Admin uid: admin userPassword:: e1NTSEF9bEtlTUNzLy9OK1JsV2hCWEM2U2ZZNDh0Lzd0OHBlbjFrdjkxN3c9P Q==
createTimestamp: 20141003000008.689Z creatorsName: 0.9.2342.19200300 .100.1.1 = admin、2.5.4.11 = System EntryCSN:20141020004319.002000Z#000000#001#000000 ENTRYDN:CN = admin、OU = USER、O = Organization EntryParentID:8204B2DF-FF5A-413A-A063-4ACD35D35BBEE4BBEE4MIDCY4MIDCY4MIDCY4MIDCY4MIDCY4MIDCY4MIDCY4MIDCY4MIDCY4MIDCY4MIDCY4MIDCY4MIDCY4BEE4 ModifiersName:0.9.2342.19200300.100.1.1 = admin、2.5.4.11 = System ModiyTimestamp:20141020004319.002Z PWDFAILURETIME:20141020003207.120Z PWDHISTORY ::
0MCM4I1lXUnRhVzQ9 pwdPolicySubentry: cn=デフォルト、ou=pwdPolicy、o=組織dn: cn=default,ou=pwdPolicy,o=organization objectClass: デバイス
objectClass: pwdPolicy objectClass: トップ cn: デフォルト
pwdAttribute: userPassword pwdExpireWarning: 3600 pwdGraceExpire: 1 pwdLockout: TRUE pwdLockoutDuration: 120 pwdMaxAge: 2592000
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>