当存在其他安全约束时,传输保证CONFIDENTIAL被忽略

时间:2015-11-25 14:13:24

标签: java https java-ee-6 web.xml

我正在运行JAX-RS Web服务,我希望使用安全连接来保护所有这些服务。所以我将其添加到我的web.xml

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Prohibit unsecured HTTP</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

这样可以正常使用(在我的EAP standalone.xml中设置从HTTP到HTTPS的重定向,但我可能会将其关闭)。

但是,当我现在想为某些资源设置BasicAuth时,我会添加另一个更窄的约束:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Project editing</web-resource-name>
        <url-pattern>/projects</url-pattern>
        <url-pattern>/projects/*</url-pattern>
        <http-method>POST</http-method>
        <http-method>PUT</http-method>
        <http-method>PATCH</http-method>
        <http-method>DELETE</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>AUTH_USER</role-name>
    </auth-constraint>
</security-constraint>

然后突然对这些网址的请求 - 以及此处未提及的GET请求 - 很高兴通过HTTP提供。

如果我正确理解EE6 documentation那么在几个安全约束的情况下,它会结合url-patterns和http-methods。但它没有提及有关运输保障的任何内容。

我该如何解决这个问题?无处不在的HTTPS和某些网址上的BasicAuth?

2 个答案:

答案 0 :(得分:0)

到目前为止,我已尝试过这两种选择:

1)还将CONFIDENTIAL保证添加到第二个安全约束。这有助于中途。现在POST,PUT等只是HTTPS,但GET请求&#34;项目&#34;仍然通过HTTP。

这可以通过添加第三个安全约束块来解决,该块定义了CONFIDENTIAL但没有对GET请求进行身份验证,但这看起来非常错误并且难以维护。

2)使用web.xml代替@WebFilter并{}拒绝HTTP请求。

@WebFilter(filterName = "NoHttpFilter", urlPatterns = { "/*" })
public class NoHttpFilter implements Filter {

    public void init(FilterConfig config) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest requ = (HttpServletRequest) req;
        if (!requ.isSecure()) {
            HttpServletResponse resp = (HttpServletResponse) res;
            resp.reset();
            resp.sendError(404, "If you're not speaking HTTPS, I'm not listening.");
        } else {
            chain.doFilter(req, res);
        }
    }

    public void destroy() {
    }
}

这实际上就像魅力一样,但不幸的是它在 BasicAuth之后运行,因此对受保护地点的调用将首先要求输入密码,然后根据协议拒绝输入。

答案 1 :(得分:0)

tomcat9在这里存在相同的问题。 在tomcat全球web.app中,我添加了机密信息。它适用于ROOT Webapp。 但是对于webapp#2则不是。

因此似乎webapp#2的web.xml设置之一否决了它。

有想法吗?

<security-constraint>
    <web-resource-collection>
        <url-pattern>/rest/*</url-pattern>
        <url-pattern>/ui5/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>connectorview</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login</form-login-page>
        <form-error-page>/error</form-error-page>
    </form-login-config>
</login-config>
<security-role>
    <role-name>role1</role-name>
</security-role>