AuthenticationFailureBadCredentialsEvent - 如何区分密码错误或用户名错误?

时间:2015-11-23 01:26:29

标签: spring authentication spring-security frameworks

我在Spring Framework中使用AuthenticationFailureBadCredentialsEvent。在下面的代码中,您如何获得

AuthenticationFailureBadCredentialsEvent 

区分用户是输入了错误的用户ID还是输入了错误的密码?此外,似乎建议转到jsp错误网页的典型方式(即"错误:无效凭据")是在spring security .xml文件中硬编码的网址。 Spring是否提供了一种分支到java程序(某种控制器?或者另一种程序?)的方法,然后根据用户输入的用户标识或密码选择一个网页? (即如果他们连续5次输入错误的密码,我可以做锁定用户的事情。)

package test
import org.springframework.context.ApplicationListener;
import org.springframework.security.authentication.event.AbstractAuthenticationEvent;
import org.springframework.security.authentication.event.AuthenticationFailureBadCredentialsEvent;
import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
import org.springframework.stereotype.Component;

@Component
public class UserAuthenticationErrorHandler implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {
    @Override
    public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) {

        Object userName = event.getAuthentication().getPrincipal();
        Object credentials = event.getAuthentication().getCredentials();
        System.out.println("Failed login using USERNAME " + userName);
        System.out.println("Failed login using PASSWORD " + credentials);
    }
}

一个参考: http://www.mkyong.com/spring-security/spring-security-hello-world-example/ http://docs.spring.io/autorepo/docs/spring-security/4.0.3.RELEASE/apidocs/org/springframework/security/core/userdetails/UserDetails.html

感谢您对上述任何建议。

1 个答案:

答案 0 :(得分:1)

通过使用上面的代码,我想出了一些改进:

  1. 使用AuthenticationFailureHandler可能更合适,因为它使用HttpServletRequest请求,其中as AuthenticationFailureBadCredentialsEvent似乎不允许您访问HttpServletRequest请求。
  2. org.springframework.security.web.authentication.AuthenticationFailureHandler

    用于处理失败的身份验证尝试的策略。 典型的行为可能是将用户重定向到身份验证页面(如果是表单)  登录)让他们再试一次。可以实现更复杂的逻辑,具体取决于  异常的类型。例如,CredentialsExpiredException可能导致重定向  一个允许用户更改密码的Web控制器。 以来:      3.0

    1. 将用户名拉出异常非常有用:exception.getExtraInformation()。toString()。