在Tomcat中检测域身份验证失败原因
我为Tomcat7编写了一个自定义域。我将它包装在Tomcat默认安装提供的锁定域中。锁定功能工作正常,但在我的web.xml中,我有在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 这将引导任何未进行身份验证的用户访问该页面。但是,如果用户被锁定,它也会
<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()发送到相应的错误页面。谢谢!我希望有一个解决办法,而不是一个变通办法。尽管如此,我们还是非常感谢您的回复。