1

我试图显示没有使用 spring security 的用户的无效尝试。我正在使用自定义 User 类来获取除用户名和密码之外的其他用户详细信息。我创建了两个侦听器类,即 AuthenticationSuccessEventListener 和 AuthenticationFailureListener 来更新用户的无效尝试。

现在在 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/密码,因此我将用户 ID 作为参数传递给所有方法,包括 loadUserByUsername(strUserID)。

如何从 AuthenticationFailureBadCredentialsEvent / AuthenticationSuccessEvent 对象中获取侦听器类中的自定义用户对象?

4

1 回答 1

1

该事件仅包含身份验证请求对象,即Authentication传递给的对象AuthenticationManager和失败的对象。因此它将包含提交的用户名作为主体。

身份验证可能由于多种原因而失败,包括不存在的用户名,实际上甚至根本不需要涉及UserDetails对象,因此如果您想要完整的信息,您需要使用用户名加载它。

或者,您可以自定义 anAuthenticationProvider以在实现本身中执行您想要的额外工作,而不是通过事件。

于 2013-05-05T17:23:17.410 回答