0

次の構成を使用して 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>

4

1 に答える 1

1

パスワード ロックの例外ではなく、次の例外が発生します。

LDAP パスワード ポリシー ドラフト 10から:

8.1.1. アカウントがロックされている場合は失敗します

セクション 7.1 で指定されているようにアカウントがロックされている場合、サーバーは適切な resultCode (つまり、バインド操作の場合は invalidCredentials (49)、比較操作の場合は compareFalse (5) など) で操作に失敗します。サーバーはエラーを設定する場合があります: メッセージのコントロール フィールドの passwordPolicyResponse に accountLocked (1)。

したがって、LDAP サーバーは正しく動作しています。

ユーザーの認証中にSpring LDAPがPwdPolicy(パスワード試行のカウント)をチェックしているとは思わない

チェックを行うのは LDAP サーバーです。Spring は、上記のパスワード ロック ステータスを確認できるようにする追加のリクエスト コントロールを提供する必要があります。しかし、いずれにせよ、ログイン時にログインに失敗した理由をユーザーに明らかにしたくはありません。これは情報漏えいです。これは、ユーザー名が正しいことを攻撃者に伝えることになり、決して望ましくありません。ユーザーが自分のパスワードが正しいと思う場合はログインに失敗した理由を尋ねさせるか、パスワードを紛失した場合の手順を実行させます。

于 2014-10-20T05:36:47.470 に答える