3

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

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

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

4

3 回答 3

2

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

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

解决方法:如果您使用的是 Servlet 3.0,请使用接口的login方法,HttpServletRequest自己实现锁定逻辑并在您的 servlet 调用HttpServletRequest.login() . 如果它高于限制,请不要调用login()并打印自定义错误消息。

于 2011-10-01T17:46:51.917 回答
1

有同样的问题。请求范围内可能有一些东西。对我在 Tomcat 5.5 中使用的另一个锁定领域有经验,它将放入请求范围“com.ofc.tomcat.LOGIN_FAILURE_MESSAGE”,如果不存在,则用户必须被锁定。

于 2011-12-08T15:25:35.730 回答
1

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

于 2016-02-08T13:12:22.440 回答