如何从AuthenticationFailureBadCredentialsEvent / AuthenticationSuccessEvent对象获取自定义User对象

时间:2013-05-05 13:38:05

标签: spring spring-security spring-webflow

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

现在在onApplicationEvent方法中,我正在尝试获取自定义User对象(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()返回一个String,即我试图将其强制转换为CustomUserDetails(自定义用户类)的用户名,我收到错误。

P.S - 我在登录页面输入用户名/密码,因此我将userid作为参数传递给所有方法,包括loadUserByUsername(strUserID)。

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

1 个答案:

答案 0 :(得分:1)

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

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

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