1

春のセキュリティを使用してユーザーの無効な試行を表示しようとしています.カスタム User クラスを使用して、ユーザー名とパスワード以外の追加のユーザー詳細を取得しています。ユーザーの無効な試行を更新するために、AuthenticationSuccessEventListener と AuthenticationFailureListener という 2 つのリスナー クラスを作成しました。

onApplicationEvent メソッドで、以下に示すようにカスタム ユーザー オブジェクト (CustomUserDetails) を取得しようとしています。

    @Component
    public class AuthenticationFailureListener implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {
        @Autowired
        private ILoginDAO loginDAO ;            
        @Override
        public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) {
            CustomUserDetails user = (CustomUserDetails)event.getAuthentication().getPrincipal();//I get ClassCastException here.
            String strUserID = user.getUserID();
            CustomUserDetails customUser = loginDAO.loadUserByUsername(strUserID);
            if (customUser != null){
        ...
       } } }

event.getAuthentication().getPrincipal() は文字列、つまりユーザー名を返します。これを CustomUserDetails (カスタム ユーザー クラス) にキャストしようとすると、エラーが発生します。

PS - ログインページにユーザー ID/パスワードを入力しているため、loadUserByUsername(strUserID) を含むすべてのメソッドのパラメーターとしてユーザー ID を渡します。

AuthenticationFailureBadCredentialsEvent / AuthenticationSuccessEvent オブジェクトからリスナー クラスのカスタム User オブジェクトを取得するにはどうすればよいですか?

4

1 に答える 1

1

イベントには、認証要求オブジェクト、つまりAuthenticationに渡されたAuthenticationManagerものと失敗したものだけが含まれます。したがって、送信されたユーザー名がプリンシパルとして含まれます。

認証は、存在しないユーザー名など、さまざまな理由で失敗する可能性があり、実際にはUserDetailsオブジェクトをまったく必要としないため、完全な情報が必要な場合は、ユーザー名を使用してロードする必要があります。

あるいは、 をカスタマイズしAuthenticationProviderて、イベントを介するのではなく、実装自体で必要な追加作業を実行することもできます。

于 2013-05-05T17:23:17.410 に答える