7

javax.faces.webapp.FacesServlet文档中,提到了,

允许的 HTTP 方法

JSF 规范只要求使用 GET 和 POST http 方法。如果您的 Web 应用程序不需要任何其他 http 方法,例如 PUT 和 DELETE,请考虑使用<http-method><http-method-omission>元素限制允许的 http 方法。有关使用这些元素的更多信息,请参阅 Java Servlet 规范的安全性。


我的应用程序确实不依赖于其他 HTTP 方法(除了GETPOST)。因此,我试图使用<http-method>(or <http-method-omission>) 来排除除GETand之外的所有方法POST

在 web.xml 中,JAAS Servlet 安全约束配置如下。

<security-constraint>
    <display-name>AdminConstraint</display-name>
    <web-resource-collection>
        <web-resource-name>ROLE_ADMIN</web-resource-name>
        <description/>
        <url-pattern>/admin_side/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>ROLE_ADMIN</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description/>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<security-constraint>
    <display-name>UserConstraint</display-name>
    <web-resource-collection>
        <web-resource-name>ROLE_USER</web-resource-name>
        <description/>
        <url-pattern>/user_side/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>ROLE_USER</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description/>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

使用这些元素,

<http-method>GET</http-method>
<http-method>POST</http-method>

我希望所有其他 HTTP 方法都被禁止。


但是,GlassFish Server 4.1 在服务器终端上记录以下警告。

警告:JACC:对于 URL 模式/user_side/*,除了以下方法之外的所有方法都被发现:POST、GET

警告:JACC:对于 URL 模式/admin_side/*,除了以下方法之外的所有方法都被发现:POST、GET

这是什么意思?


另外,不是在所有<security-constraint>元素中都这样做,而是可以全局配置,以便它可以应用于应用程序中的所有资源,并且可以省略所有除了GETPOSTHTTP 请求,即全局应用于应用程序 - 也许通过使用更通用的专用url 模式之类的/*


这里有一个例子。

<security-constraint>
    <display-name>WebConstraint</display-name>

    <web-resource-collection>
        <web-resource-name>test</web-resource-name>
        <description/>
        <url-pattern>/test.jsp</url-pattern>
        <http-method>POST</http-method>
        <http-method>HEAD</http-method>
        <http-method>PUT</http-method>
        <http-method>OPTIONS</http-method>
        <http-method>TRACE</http-method>
        <http-method>DELETE</http-method>
    </web-resource-collection>

    <auth-constraint>
        <description/>
        <role-name>dev</role-name>
     </auth-constraint>
</security-constraint>

上面的元素表明由 url 模式 /test.jsp 引用的资源,当被除 GET 之外的所有 http 方法访问时,应该被限制为只能由属于角色 dev 的经过身份验证的用户查看。请注意,安全约束不适用于 http 方法 GET,而仅适用于其他方法(POST、HEAD、PUT 等)。

我发现强文本中的最后一句话令人困惑。这是否意味着使用GET请求,给定 url-pattern 中列出的资源可以被匿名用户访问,因为这意味着“安全约束不适用于 http-method GET ”?

4

1 回答 1

10

这是什么意思?

这意味着除了 GET 和 POST 之外的所有方法都未被发现,意味着不受保护。/user_side/*每个人都可以使用PUT 和 HEAD 等方法访问 url 模式,无需身份验证。

要保护其他方法,请添加以下内容:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>protected</web-resource-name>
        <url-pattern>/user_side/*</url-pattern>
        <http-method-omission>GET</http-method-omission>
        <http-method-omission>POST</http-method-omission>
    </web-resource-collection>
    <auth-constraint/>
</security-constraint>

如果您使用的是 Servlet 3.1,您还可以使用较短的标签:

<deny-uncovered-http-methods/>

此外,不是在所有元素中都这样做,而是可以全局配置,以便它可以应用于应用程序中的所有资源,并且可以省略除 GET 和 POST HTTP 请求之外的所有请求,即全局应用于应用程序 - 也许通过使用更多通用的 url 模式,如 /*?

是的,这是可能的。您可以使用 url 模式/来包含所有子文件夹。

我发现强文本中的最后一句话令人困惑。这是否意味着使用 GET 请求,给定 url-pattern 中列出的资源也可以被匿名用户访问,因为这意味着“安全约束不适用于 http 方法 GET”?

你是对的,这意味着匿名用户可以使用 GET 方法访问给定的 url-pattern。所有其他方法都受到保护。

也可以看看:

于 2014-12-12T00:38:36.783 回答