我正在运行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?
答案 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>