一尘不染

在Tomcat中检测领域身份验证失败的原因

tomcat

我为Tomcat 7编写了一个自定义领域。我将其包装在默认安装的Tomcat提供的锁定领域中。锁定功能可以正常工作,但是在我的web.xml中,

<error-page>
<error-code>403</error-code>
<location>/forbidden.html</location>
</error-page>

这会将所有未通过身份验证的用户定向到该页面。但是,如果被正确验证的用户被锁定,它还会将其重定向到该页面。当用户错误地进行身份验证并被锁定时,是否可以通过某种方式检测到差异?


阅读 280

收藏
2020-06-16

共1个答案

一尘不染

看起来并不容易。我的第一个想法是子类化,LockOutRealm如果用户被锁定,则向请求上下文添加一些内容,您可以稍后将其打印到用户界面。不幸的是,它不起作用,因为刚才的authenticate方法LockOutRealm获得了登录名和密码,并且那里没有请求或上下文对象。

另一个问题是,当身份验证失败时,authenticate方法将返回null,并且LockOutRealm也会这样做。LockOutRealm身份验证失败时,的行为与任何其他领域的行为之间没有区别。

解决方法:如果您正在使用Servlet
3.0,请使用接口login方法,HttpServletRequest自己实现锁定逻辑,并在Servlet调用之前检查失败的登录尝试次数HttpServletRequest.login()
。如果高于限制,则不要调用login()并打印自定义错误消息。

2020-06-16