3

我正在尝试将 PrimeFaces 添加到我的项目中。它使用Glassfish 3基于表单的身份验证运行。我下载了jar并放入WEB-INF/lib. 登录后,我看到了一个带有 URL 的 css 文件:

localhost:8080/[webapp]/javax.faces.resource/theme.css.jsf?ln=primefaces-aristo

如果我禁用安全检查,则不会发生这种情况。这是我的 web.xml 中的登录部分。

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
      <form-login-page>/login.jsf</form-login-page>
      <form-error-page>/login.jsf?failed=true</form-error-page>
    </form-login-config>
</login-config>

谁能告诉我有什么问题?谢谢!

4

3 回答 3

4

这是由浏览器缓存的受限页面引起的。

容器管理的安全性将重定向到触发身份验证检查的最后一个 HTTP 请求。在您的情况下,它显然是自动包含的 PrimeFaces 主题 CSS 文件。如果浏览器从浏览器缓存中完全加载了待认证页面,而浏览器从服务器端完全加载了 CSS 文件,或者通过条件 GET 请求测试了 CSS 文件的缓存有效性,则可能会发生这种情况. 然后,容器管理的安全性将准确地记住这个 URL 作为重定向成功后登录 URL。

您想从身份验证检查中排除 JSF 资源 (<h:outputScript><h:outputStylesheet><h:graphicImage>您可以通过排除常见的 URL 模式来做到这一点/javax.faces.resource/*

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Allowed resources</web-resource-name>
        <url-pattern>/javax.faces.resource/*</url-pattern>
    </web-resource-collection>
    <!-- No Auth Contraint! -->
</security-constraint>

需要指示浏览器不要缓存受限页面,以防止浏览器从缓存中加载它(例如,在注销后按返回按钮)。将以下过滤器映射到与您的<security-constraint>.

@WebFilter("/secured/*") // Use the same URL pattern as <security-constraint>
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            res.setDateHeader("Expires", 0); // Proxies.
        }

        chain.doFilter(request, response);
    }

    // ...
}

请注意,这也解决了“后退按钮”问题。因此,在注销/注销后按下后退按钮时,最终用户也不会再看到受限页面,这在您当前的设置中会发生。

于 2013-01-09T10:47:53.657 回答
2

您应该从验证中排除 Web 资源。例如<url-pattern>*.css</url-pattern>在您的<security-constraint>元素中添加。对所有不需要安全检查的 Web 资源(js、图像等)执行此操作。

于 2013-01-09T08:18:03.533 回答
0

似乎您的安全约束中有错误的 url 模式。

查看此示例以获取工作版本。

http://blog.eisele.net/2011/01/jdbc-security-realm-and-form-b​​ased.html

于 2013-01-09T08:10:17.167 回答