通過 pattern 指定當(dāng)前 intercept-url 定義應(yīng)當(dāng)作用于哪些 url。
<security:intercept-url pattern="/**" access="ROLE_USER"/>
可以通過 access 屬性來指定 intercept-url 對應(yīng) URL 訪問所應(yīng)當(dāng)具有的權(quán)限。access 的值是一個字符串,其可以直接是一個權(quán)限的定義,也可以是一個表達(dá)式。常用的類型有簡單的角色名稱定義,多個名稱之間用逗號分隔,如:
<security:intercept-url pattern="/secure/**" access="ROLE_USER,ROLE_ADMIN"/>
在上述配置中就表示 secure 路徑下的所有 URL 請求都應(yīng)當(dāng)具有 ROLE_USER 或 ROLE_ADMIN 權(quán)限。當(dāng) access 的值是以 “ROLE_” 開頭的則將會交由 RoleVoter 進(jìn)行處理。
此外,其還可以是一個表達(dá)式,上述配置如果使用表達(dá)式來表示的話則應(yīng)該是如下這個樣子。
<security:http use-expressions="true">
<security:form-login />
<security:logout />
<security:intercept-url pattern="/secure/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/>
</security:http>
或者是使用 hasRole()表達(dá)式,然后中間以 or 連接,如:
<security:intercept-url pattern="/secure/**" access="hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')"/>
需要注意的是使用表達(dá)式時需要指定 http 元素的 use-expressions=”true”。更多關(guān)于使用表達(dá)式的內(nèi)容將在后文介紹。當(dāng) intercept-url 的 access 屬性使用表達(dá)式時默認(rèn)將使用 WebExpressionVoter 進(jìn)行處理。
此外,還可以指定三個比較特殊的屬性值,默認(rèn)情況下將使用 AuthenticatedVoter 來處理它們。IS_AUTHENTICATED_ANONYMOUSLY 表示用戶不需要登錄就可以訪問;IS_AUTHENTICATED_REMEMBERED 表示用戶需要是通過 Remember-Me 功能進(jìn)行自動登錄的才能訪問;IS_AUTHENTICATED_FULLY 表示用戶的認(rèn)證類型應(yīng)該是除前兩者以外的,也就是用戶需要是通過登錄入口進(jìn)行登錄認(rèn)證的才能訪問。如我們通常會將登錄地址設(shè)置為 IS_AUTHENTICATED_ANONYMOUSLY。
<security:http>
<security:form-login login-page="/login.jsp"/>
<!-- 登錄頁面可以匿名訪問 -->
<security:intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<security:intercept-url pattern="/**" access="ROLE_USER"/>
</security:http>
需求可以通過指定 intercept-url 的 requires-channel 屬性來指定。requires-channel 支持三個值:http、https 和 any。any 表示 http 和 https 都可以訪問。
<security:http auto-config="true">
<security:form-login/>
<!-- 只能通過 https 訪問 -->
<security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" requires-channel="https"/>
<!-- 只能通過 http 訪問 -->
<security:intercept-url pattern="/**" access="ROLE_USER" requires-channel="http"/>
</security:http>
需要注意的是當(dāng)試圖使用 http 請求限制了只能通過 https 訪問的資源時會自動跳轉(zhuǎn)到對應(yīng)的 https 通道重新請求。如果所使用的 http 或者 https 協(xié)議不是監(jiān)聽在標(biāo)準(zhǔn)的端口上(http 默認(rèn)是 80,https 默認(rèn)是 443),則需要我們通過 port-mapping 元素定義好它們的對應(yīng)關(guān)系。
<security:http auto-config="true">
<security:form-login/>
<!-- 只能通過 https 訪問 -->
<security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" requires-channel="https"/>
<!-- 只能通過 http 訪問 -->
<security:intercept-url pattern="/**" access="ROLE_USER" requires-channel="http"/>
<security:port-mappings>
<security:port-mapping http="8899" https="9988"/>
</security:port-mappings>
</security:http>
通常我們都會要求某些 URL 只能通過 POST 請求,某些 URL 只能通過 GET 請求。這些限制 Spring Security 也已經(jīng)為我們實(shí)現(xiàn)了,通過指定 intercept-url 的 method 屬性可以限制當(dāng)前 intercept-url 適用的請求方式,默認(rèn)為所有的方式都可以。
<security:http auto-config="true">
<security:form-login/>
<!-- 只能通過 POST 訪問 -->
<security:intercept-url pattern="/post/**" method="POST"/>
<!-- 只能通過 GET 訪問 -->
<security:intercept-url pattern="/**" access="ROLE_USER" method="GET"/>
</security:http>
method 的可選值有 GET、POST、DELETE、PUT、HEAD、OPTIONS 和 TRACE。
更多建議: