我有一个映射到 /* 的过滤器,我的安全约束映射到 /*。
当应用程序未配置(数据库中的条目)时,过滤器执行请求转发。
当我访问应用程序时,我希望看到 j_securit_check 提供的登录页面,但执行过滤器并执行转发。这以循环结束,因为我从未进入登录页面。
我认为在处理过滤器之前执行了安全检查?
这是 WebSphere 8.0.0.4。它在 Tomcat 和 JBoss 下运行良好。
谢谢阅读。
我有一个映射到 /* 的过滤器,我的安全约束映射到 /*。
当应用程序未配置(数据库中的条目)时,过滤器执行请求转发。
当我访问应用程序时,我希望看到 j_securit_check 提供的登录页面,但执行过滤器并执行转发。这以循环结束,因为我从未进入登录页面。
我认为在处理过滤器之前执行了安全检查?
这是 WebSphere 8.0.0.4。它在 Tomcat 和 JBoss 下运行良好。
谢谢阅读。
根据我的理解,由于安全原因,您应该无法拦截 j_security_check 调用。
听起来像是 Webspehere 中的一个错误(我用谷歌搜索了它,这是旧版本 Websphere 中的一个错误/功能,不确定 8.0.0.4)
您不能,但是您可以在 j_security_check 上映射过滤器以进行身份验证后处理,或者您可以编写自己的自定义登录模块或信任关联拦截器,请参见此处的示例:http: //www.ibm.com/developerworks/websphere/techjournal/ 1112_deluca/1112_deluca.html
如果我将安全约束映射到 /*,然后将过滤器映射到 /(没有通配符),一切都会按预期工作。
这是我从 IBM 得到的关于为什么它在运行安全检查之前运行 servlet 过滤器的回复。
安全 L3 与 Webcontainer 团队的开发人员进行了交谈。他说首先运行servlet过滤器是WAD。j_security_check 是一个 Web 资源,与所有 Web 资源请求一样,servlet 过滤器将首先运行。这就是您所关心的问题的简短回答。安全 L3 查看请求流。似乎过滤器的编码方式,login.jsp 结果永远不会返回给客户端,因此从来没有做过 j_security_check。可以看到过滤器做了一个"request.getRequestDispatcher("test/test-page.jsp").forward(request, response);"。开发人员说 forward() 请求没有经过身份验证检查,再次是 WAD。因此,在重新设计 servlet 过滤器时,请在 minf 中保留以下内容。
- 1 Servlet 过滤器将在 j_security_check 或任何 web 资源之前调用。
- 2 使用 request.getRequestDispatcher().forward() 禁用身份验证检查。
我不会重新设计我的过滤器,因为它在 Tomcat 或 JBoss 下运行时按预期工作。唯一需要更改的是 web.xml 中的映射。
这是 IBM 的另一个回应。他们建议来自过滤器的转发永远不会受到 j_security_check 的保护,因此在使用 WebSphere 时要小心。Jboss 和 Tomcat 的行为并非如此。
web.xml 显示 [configFilter] 映射到 /* 即 configFilter /*
并且安全性也映射到所有,即通用身份验证。/*
入站请求是针对 [/rootFilter/test/test-page.jsp],调用安全性,然后重定向到 [rootFilter/login.jsp]。现在对于请求 [rootFilter/login.jsp],由于过滤器 [configFilter]] 映射到所有请求,因此执行 [configFilter] 将请求转发到 [/rootFilter/test/test-page.jsp] 然后进行测试-page.jsp 已提供。
根据 13.2 声明性安全性中的 Java Servlet 规范,安全性对于任何分派的请求都无效,因此转发到 [/rootFilter/test/test-page.jsp] 的请求不会检查安全性。
这里来自规范,安全模型适用于 Web 应用程序的静态内容部分以及客户端请求的应用程序中的 servlet 和过滤器。当 servlet 使用 RequestDispatcher 调用静态资源或使用转发或包含的 servlet 时,安全模型不适用。
客户需要查看应用程序的设计,以确保过滤器未映射到所有请求或过滤器未转发到其他资源。