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

在Tomcat中检测域身份验证失败原因,tomcat,security,realm,Tomcat,Security,Realm,我为Tomcat7编写了一个自定义域。我将它包装在Tomcat默认安装提供的锁定域中。锁定功能工作正常,但在我的web.xml中,我有 <error-page> <error-code>403</error-code> <location>/forbidden.html</location> </error-page> 403 /禁止的.html 这将引导任何未进行身份验证的用户访问该页面。但是,如果用户被锁定,它也会

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

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

403
/禁止的.html

这将引导任何未进行身份验证的用户访问该页面。但是,如果用户被锁定,它也会将经过正确身份验证的用户重定向到页面。当用户身份验证错误并被锁定时,我是否有办法检测到差异

这看起来并不容易。我的第一个想法是将
LockOutRealm
子类化,并在用户被锁定时向请求上下文添加一些内容,稍后可以将这些内容打印到用户界面。不幸的是,它将无法工作,因为服务器刚刚获得登录名和密码,并且没有请求或上下文对象

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

解决方法:如果您使用的是Servlet 3.0,请使用,在Servlet调用
HttpServletRequest.login()之前,自己实现锁定逻辑并检查失败登录尝试的次数

. 如果高于限制,不要调用
登录()
并打印自定义错误消息。

也有同样的问题。请求范围中可能有某些内容。有过我在Tomcat 5.5中使用的另一个锁定领域的经验,它将被放入请求范围“com.ofc.Tomcat.LOGIN\u FAILURE\u MESSAGE”,如果不存在,那么用户一定被锁定了

这条线索很老了,我的答案肯定很晚了。然而,我将列举一种实现上述目标的方法。在Tomcat中,提供失败原因的身份验证后的自定义消息稍微复杂一些,但是,它是可以实现的。要实现这一点,其中一种方法是构造一个自定义Tomcat阀,并将其添加到适当的级别(主机、引擎或上下文)。如果任何web应用程序使用表单身份验证,Tomcat会自动将FormAuthentication阀插入处理管道。这个想法是从浏览器截取“j_security_check”操作,并在使用FormAuthentication Valve登录之前进行一些预验证。在“invoke”方法中,用户名('j_username')和密码('j_password')都可以作为请求对象的明文使用。通过这些,可以通过直接进入领域(数据库或LDAP等)来检查帐户是否被锁定或用户是否需要更改密码等。通过该阀,可以将响应.redirect()发送到相应的错误页面。

谢谢!我希望有一个解决办法,而不是一个变通办法。尽管如此,我们还是非常感谢您的回复。