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

qpgpyjmq  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(437)

我在Spring框架中使用了AuthenticationFailureBadCredentialsEvent。

AuthenticationFailureBadCredentialsEvent

以区分用户输入的是错误的userid还是错误的密码?此外,建议转到jsp错误网页的典型方式(即“错误:Invalid Credentials”)是在springsecurity.xml文件中硬编码一个url。Spring是否提供了一种方法来分支到一个java程序(某种控制器?或者,另一种类型的程序?),然后根据用户输入的是userid还是密码来选择一个网页?(也就是说,如果用户连续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显示器
感谢您对上述内容的任何建议。

nhhxz33t

nhhxz33t1#

通过使用上面的代码,我提出了一些改进:
1.使用AuthenticationFailureHandler可能更合适,因为它使用HttpServletRequest请求,而AuthenticationFailureBadCredentialsEvent似乎不给予您对HttpServletRequest请求的访问权限。
验证失败处理程序
用于处理失败的验证尝试的策略。典型的行为可能是将用户重定向到验证页(在表单登录的情况下)以允许他们重试。根据异常的类型,可能会实施更复杂的逻辑。例如,CredentialsExpiredException可能会导致重定向到允许用户更改其口令的Web控制器。由于:3.0
1.从异常中提取用户名可能很有用:如果您有任何错误,请使用以下方法。

oymdgrw7

oymdgrw72#

晚了几年,但无论如何,如果任何人阅读本文绝对需要获得HttpServletRequest,并且还希望坚持使用AuthenticationFailureBadCredentialsEvent,您可以使用ServletRequestAttributes获得实际请求:

private static HttpServletRequest getRequest() {
    ServletRequestAttributes attrs = 
       (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
    if (attrs == null) {
        return null;
    }

    return attrs.getRequest();
}

相关问题