ほとんどの場合、認証と認証の役割としてユーザー名とパスワードのみを使用する場合、独自のUserDetailsServiceを実装するだけで十分です。
ユーザ名パスワード認証の流れは次のように一般的にその後である:
- スプリングセキュリティフィルタ(基本認証/フォーム/ ..)ユーザ名とパスワードをピックアップし、UsernamePasswordAuthenticationオブジェクトにそれを回すとAuthenticationManager
- 認証マネージャは、この場合DaoAuthenticationProviderある、UsernamePasswordtokensを処理し、認証のために沿ってトークンを渡すことができる候補者を探し上に渡し
- 認証プロバイダは、メソッドを呼び出しloadUse rByUsernameインターフェイスであり、ユーザーが存在しない場合はUsernameNotFound例外がスローされるか、ユーザー名、パスワード、および権限が含まれるUserDetailsオブジェクトが返されます。
- 次に、認証プロバイダは、提供されたUsernamePasswordTokenとUserDetailsオブジェクトのパスワードを比較します。 (PasswordEncodersを介してパスワードハッシュも処理できます)一致しない場合、認証は失敗します。一致した場合は、ユーザーの詳細オブジェクトを登録し、Authorization部分を実行するAccessDecisionManagerに渡します。
DaoAuthenticationProviderでの検証が必要に応じている場合。それから、独自のUserDetailsServiceを実装し、DaoAuthenticationProviderの検証を微調整するだけです。次のように春3.1を使用してUserDetailsServiceため
例は次のとおりです。
春のXML:
<security:authentication-manager>
<security:authentication-provider user-service-ref="myUserDetailsService" />
</security:authentication-manager>
<bean name="myUserDetailsService" class="x.y.MyUserDetailsService" />
UserDetailsService実装:
public MyUserDetailsService implements UserDetailsService {
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//Retrieve the user from wherever you store it, e.g. a database
MyUserClass user = ...;
if (user == null) {
throw new UsernameNotFoundException("Invalid username/password.");
}
Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("Role1","role2","role3");
return new User(user.getUsername(), user.getPassword(), authorities);
}
}
私はそれが動作するかどうかが表示されます。ありがとう。 –
このようにして、ログインワークフローをカスタマイズすることはできません。 5回目の試行でユーザーをブロックしたり、電子メールを送信したりするとします。これは私が探しているものです。 –
私の提案は、DAOAuthenticationManagerをサブクラス化し、認証メソッドをオーバーライドし、tryキャッチで単にsuper.authenticateを呼び出すことです。 – Nils