2013-07-03 15 views
6

のどちらかが、私は何かが欠けてるか、それがどのように動作するかこれは...つまり
ですが、私はUserDetailsServiceを実装し、サブ分類(AppUser以下)春のユーティリティクラスUser、(それがUserDetailsを実装します)。それが重要な場合は、それはこのようなものになる:春のセキュリティは、ログイン失敗時にUserDetailsの代わりにStringをprincipalとして返しますか?

@Override 
public UserDetails loadUserByUsername(String username) 
throws UsernameNotFoundException { 
    // try loading user by its name 
    SystemUser user = null; 
    try { 
     user = this.sysUserService.getByUsername(username); 
     if(user == null) 
      throw new UsernameNotFoundException("User not found!"); 
    } 
    catch(Exception e) { 
     throw new DataRetrievalFailureException(
       "Could not load user with username: " + username); 
    } 
    // load user rights, and create UserDetails instance 
    UserDetails res = new AppUser(user, getUserAuthorities(user)); 

    return res; 
} 

をそれから私は、このアプローチを使用してアカウントのロックを実装してみました:から主要なオブジェクトを取得しようとしているときに

public class LoginFailureEventListenter implements 
ApplicationListener<AuthenticationFailureBadCredentialsEvent> { 

// rest omitted for brevity 

@Override 
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) { 
    // ... 

    SystemUser user = ((AppUser)event.getAuthentication().getPrincipal()).getSystemUser(); 
    // cast exception - how is it possible to obtain String 
    // instead of UserDetails object here ? 
    // ... 
} 
} 

はしかし、私はjava.lang.ClassCastExceptionに走りました(主オブジェクトのタイプはStringでした)。私は、問題を解決するために私のSystemUserを再度ロードすることができますが、私はこれを期待していませんでした。
このシナリオでは、getPrincipal()getPrincipal()インスタンスを返すべきであるとソースドキュメントでも考えています。
考えますか?

答えて

5

私たちは認証に失敗しているので、イベントのAuthenticationオブジェクトはAuthenticationManagerに提出されたオブジェクトです(拒否されました)。

典型的なシナリオでは、これはUsernamePasswordAuthenticationTokenとなります。ここで、「プリンシパル」プロパティは送信されたユーザー名です。

AuthenticationManagerは、さまざまな認証メカニズムをサポートしています。その観点からは、UserDetailsServiceが認証にも関与しているという保証はありません。それが知っているのは、認証トークンが受け入れられなかったことです(例外がありました)、それに応じてイベントを公開します。

代わりに、AuthenticationProviderを使用中にカスタマイズするか、AuthenticationFailureHandler(たとえば、フォームログインを使用している場合)を接続して余分な作業を行います。

+0

これは実際にはそうなっている方法です...?私はすでに 'AuthenticationSuccessHandler'をカウンタリセットに使用しています。これが正しい方法であるかどうかを知ることはできません。' AuthenticationFailureHandler'を試してみるのは私には起こりませんでした。 – Less

+0

はい、その通りです。イベントは「これは失敗した認証要求です」と表示され、認証要求にはユーザーの文字列識別子のみが含まれています。 –

関連する問題