我为Tomcat 7编写了一个自定义Realm。我将它包装在Tomcat默认安装提供的锁定Realm中。锁定功能正常,但在我的web.xml中,我有
<error-page>
<error-code>403</error-code>
<location>/forbidden.html</location>
</error-page>
将指向未对页面进行身份验证的任何用户。但是,如果它们被锁定,它还会将经过身份验证的用户重定向到该页面。当用户错误地验证并被锁定时,我是否可以检测到差异?
答案 0 :(得分:2)
看起来并不容易。我的第一个想法是继承LockOutRealm
并在请求上下文中添加一些东西,如果用户被锁定,您可以在以后打印到用户界面。不幸的是它不起作用,因为authenticate
methods of the LockOutRealm
只获得了登录名和密码,并且那里没有请求或上下文对象。
另一个问题是authenticate
方法在身份验证失败时返回null
,LockOutRealm
也会这样做。
当身份验证失败时,LockOutRealm
的行为与任何其他域的行为没有区别。
解决方法:如果您使用的是Servlet 3.0,请使用login
method of the HttpServletRequest
interface,自己实施锁定逻辑,并在servlet调用HttpServletRequest.login()
之前检查失败的登录尝试次数
。如果它高于限制,请不要调用login()
并打印自定义错误消息。
答案 1 :(得分:1)
有同样的问题。请求范围中可能存在某些内容。有与Tomcat 5.5一起使用的另一个锁定领域的经验,它会将请求范围放入“com.ofc.tomcat.LOGIN_FAILURE_MESSAGE”中,如果不存在,那么用户必须已被锁定。
答案 2 :(得分:1)
这个帖子很老了,我的回答肯定是非常迟缓的。但是,我将列举一种完成上述操作的方法。认证后提供失败原因的自定义消息在Tomcat中稍微复杂,但是,它可以实现。为此,其中一种方法是构造一个自定义Tomcat Valve并将其添加到适当的级别(Host,Engine或Context)。如果任何Web应用程序使用FORM身份验证,Tomcat会自动将FormAuthentication Valve插入到处理管道中。我们的想法是拦截“j_security_check”&#39; j_security_check&#39;来自浏览器的操作,并在使用FormAuthentication Valve登陆之前进行一些预验证。在&#39;调用&#39;方法,用户名(&#39; j_username&#39;)和密码(&#39; j_password&#39;)都可以作为请求对象的明文提供。通过这些,可以通过直接进入领域(数据库或LDAP等)来检查帐户是否被锁定或用户是否需要更改密码等。从这个阀门,可以将response.redirect()发送到适当的错误页面。