使用Spring Security,如何使用HTTP方法(例如GET,PUT,POST)来区分特定URL模式的安全性?


问题内容

Spring Security参考指出:

您可以使用多个元素为不同的URL集定义不同的访问要求,但是将按照列出的顺序评估它们,并且将使用第一个匹配项。因此,您必须将最具体的匹配项放在顶部。您还可以添加方法属性以将匹配限制为特定的HTTP方法(GET,POST,PUT等)。如果请求匹配多个模式,则特定于方法的匹配将优先考虑,而不管顺序如何。

如何配置Spring Security,以便根据用于访问URL模式的HTTP方法,以不同的方式保护对特定URL模式的访问?


问题答案:

这仅与配置有关。它表示<intercept-url>将在<http />配置文件的标记中从上到下评估元素:

<http auto-config="true">
    <intercept-url pattern="/**" access="isAuthenticated" />
    <intercept-url pattern="/login.jsp" access="permitAll" />
</http>

在上面的示例中,我们试图仅允许经过身份验证的用户访问所有内容,除了登录页面(用户必须先登录,对吧!!)。但是,根据文档,这 将不起作用
,因为不太具体的匹配位于最前面。因此,完成此示例目标的正确配置之一是:

<http auto-config="true">
    <intercept-url pattern="/login.jsp" access="permitAll" />
    <intercept-url pattern="/**" access="isAuthenticated" />
</http>

将更具体的匹配放在最前面。

引号所说的最后一件事是关于HTTP方法的。您可以使用它来指定匹配项,因此:

<http auto-config="true">
    <intercept-url pattern="/client/edit" access="isAuthenticated" method="GET" />
    <intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST" />
</http>

在第二个示例中,/client/edit通过GET 访问仅需要对用户进行身份验证,但是/client/edit通过POST
访问(例如,提交编辑表单),用户需要具有该EDITOR角色。在某些地方可能不鼓励使用该url模式,但这只是一个示例。