2013-08-13 22 views
16

私はこれが何度も答えられたことを知っていますが、私は混乱しています。私はすでに自分のアプリケーションに認証機構を持っています。私はSpring MVCの認証部分を使いたいだけです。私はSpring MVC 3とSpring Security 3を使用しています。Spring Security 3でカスタム認証を実装する方法は?

インターネットで検索すると、2つの解決策が見つかりました。最初はAuthenticationProviderインターフェイスを実装するだけです。 Example1。もう1つはUserDetailsとUserDetailsS​​ervice、Example2を実装することですので、ここで迷っています。

---- ----更新

質問の第2の部分はhereあります。回避策への解決策。

答えて

37

ほとんどの場合、認証と認証の役割としてユーザー名とパスワードのみを使用する場合、独自のUserDetailsS​​erviceを実装するだけで十分です。

ユーザ名パスワード認証の流れは次のように一般的にその後である:

  • スプリングセキュリティフィルタ(基本認証/フォーム/ ..)ユーザ名とパスワードをピックアップし、UsernamePasswordAuthenticationオブジェクトにそれを回すとAuthenticationManager
  • 認証マネージャは、この場合DaoAuthenticationProviderある、UsernamePasswordtokensを処理し、認証のために沿ってトークンを渡すことができる候補者を探し上に渡し
  • 認証プロバイダは、メソッドを呼び出しloadUse rByUsernameインターフェイスであり、ユーザーが存在しない場合はUsernameNotFound例外がスローされるか、ユーザー名、パスワード、および権限が含まれるUserDetailsオブジェクトが返されます。
  • 次に、認証プロバイダは、提供されたUsernamePasswordTokenとUserDetailsオブジェクトのパスワードを比較します。 (PasswordEncodersを介してパスワードハッシュも処理できます)一致しない場合、認証は失敗します。一致した場合は、ユーザーの詳細オブジェクトを登録し、Authorization部分を実行するAccessDecisionManagerに渡します。

DaoAuthenticationProviderでの検証が必要に応じている場合。それから、独自のUserDetailsS​​erviceを実装し、DaoAuthenticationProviderの検証を微調整するだけです。次のように春3.1を使用してUserDetailsS​​erviceため

例は次のとおりです。

春のXML:

<security:authentication-manager> 
    <security:authentication-provider user-service-ref="myUserDetailsService" /> 
</security:authentication-manager> 

<bean name="myUserDetailsService" class="x.y.MyUserDetailsService" /> 

UserDetailsS​​ervice実装:

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); 
} 

} 
+0

私はそれが動作するかどうかが表示されます。ありがとう。 –

+0

このようにして、ログインワークフローをカスタマイズすることはできません。 5回目の試行でユーザーをブロックしたり、電子メールを送信したりするとします。これは私が探しているものです。 –

+0

私の提案は、DAOAuthenticationManagerをサブクラス化し、認証メソッドをオーバーライドし、tryキャッチで単にsuper.authenticateを呼び出すことです。 – Nils

関連する問題