【问题标题】:Detect a realm authentication failure reason in Tomcat在 Tomcat 中检测领域身份验证失败原因
【发布时间】:2016-02-08 21:12:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: tomcat security realm


    【解决方案1】:

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

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

    解决方法:如果您使用的是 Servlet 3.0,请使用 login method of the HttpServletRequest interface,请自行实现锁定逻辑并在您的 servlet 调用 HttpServletRequest.login() 之前检查失败登录尝试的计数 .如果它高于限制,请不要调用login() 并打印自定义错误消息。

    【讨论】:

    • 谢谢!我曾希望有一个解决方案而不是解决方法。尽管如此,感谢您的回复。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-02-16
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 2019-07-21
        • 2014-05-02
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多