以下部分应强制所有客户端使用https连接。
<security-constraint>
<web-resource-collection>
<web-resource-name>securedapp</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
实际发生的是,只有index.html页面由ssl保护。因此,http://localhost/JAX-RS_Service/
之类的请求会重定向到https://localhost/JAX-RS_Service/
,并会显示index.html页面。 http://localhost/JAX-RS_Service/index.html
也是如此
但是如果我尝试请求http://localhost/JAX-RS_Service/services/customers/1
,则没有重定向到https,因此所有内容都通过网络以明文形式发送。
同样适用于执行身份验证
<security-constraint>
<web-resource-collection>
<web-resource-name>Authenticated customers only</web-resource-name>
<url-pattern>/services/customers/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>CUST</role-name>
</auth-constraint>
</security-constraint>
像<url-pattern>/services/*</url-pattern>
这样的网址模式无法完成这项工作。
为什么<url-pattern>/*</url-pattern>
不适用于subloacations。有办法解决这个问题吗?
答案 0 :(得分:0)
实际上我不知道为什么,但以下配置解决了我的问题。
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL Secured WebService</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Authenticated customers only</web-resource-name>
<url-pattern>/services/customers/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>CUST</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
需要添加<security-constraint>
,否则它将不适用于JBoss。有趣的是,对于Tomcat,您必须为<transport-guarantee>CONFIDENTIAL</transport-guarantee>
一次定义<url-pattern>/*</url-pattern>
,并且一切都得到妥善保护。在我看来,这更合理!