4

org.springframework.security.core.userdetails.Userをサブクラス化し、コンストラクターで次のように呼び出します。

Super (String username,
        String password,
        boolean enabled,
        boolean accountNonExpired,
        boolean credentialsNonExpired,
        boolean accountNonLocked,
        GrantedAuthority[] authorities)

次に${SPRING_SECURITY_LAST_EXCEPTION.message}、ログインが失敗したときに結果を表示するために使用します。

私が抱えている問題は、accountNotLockedをfalseに設定すると、アカウントがロックされたというエラーメッセージが表示され、パスワードが正しいかどうかに関係なく発生することです。春に検証されたクレデンシャルを最初に有効にしてから、accountNonExpired、credentialsNonExpired、およびaccountNonLockedフラグを有効にすると、私はそれをはるかに好みます。このように、ユーザーは、資格情報を正しく取得した場合にのみ、アカウントがロックされたことが通知されます。

スプリングにこれを強制する方法はありますか?

4

1 に答える 1

5

最も一般的なものを使用しDaoAuthenticationProviderていて、問題はUserDetailsCheckerこのクラスのデフォルトの実装にあると思います。DaoAuthenticationProvider.additionalAuthenticationChecksとはいえ、問題を解決するには、すべてのチェックを後で移動するだけで十分です。次の設定を試してください:

<authentication-manager alias="authenticationManager">
  <authentication-provider ref="daoAuthenticationProvider" />
</authentication-manager>

<bean id="daoAuthenticationProvider"
      class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
  <property name="userDetailsService" ref="userDetailsService"/>
  <property name="passwordEncoder" ref="passwordEncoder"/>
  <property name="preAuthenticationChecks"
      class="com.example.NullUserDetailsChecker"/>
  <property name="postAuthenticationChecks"
      class="org.springframework.security.authentication.AccountStatusUserDetailsChecker"/>
</bean>

nullオブジェクトパターンの実装ですcom.example.NullUserDetailsChecker(何もしないvoidチェックメソッドがあります)。UserDetailsChecker

于 2012-10-19T12:42:55.750 に答える