目錄html
1.1 authorizespring
1.2 authenticationexpress
1.3 accesscontrollistsession
Spring Security也有對Jsp標籤的支持的標籤庫。其中一共定義了三個標籤:authorize、authentication和accesscontrollist。其中authentication標籤是用來表明當前Authentication對象的,咱們能夠利用它來展現當前Authentication對象的相關信息。另外兩個標籤是用於權限控制的,能夠利用它們來包裹須要保護的內容,一般是超連接和按鈕。dom
若是須要使用Spring Security的標籤庫,那麼首先咱們應當將對應的jar包spring-security-taglibs-xxx.jar放入WEB-INF/lib下;其次咱們須要在頁面上引入Spring Security的標籤庫。jsp
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>lua
接下來就能夠在頁面上自由的使用Spring Security的標籤庫提供的標籤了。url
authorize是用來判斷普通權限的,經過判斷用戶是否具備對應的權限而控制其所包含內容的顯示,其能夠指定以下屬性。htm
一、access對象
access屬性須要使用表達式來判斷權限,當表達式的返回結果爲true時表示擁有對應的權限。
<sec:authorize access="hasRole('admin')">
<a href="admin.jsp">admin page</a>
</sec:authorize>
須要注意的是由於access屬性是使用表達式的,因此咱們必須確保ApplicationContext中存在一個WebSecurityExpressionHandler,最簡單的辦法就是直接使用NameSpace,經過設置http元素的use-expressions="true"讓NameSpace自動爲咱們建立一個WebSecurityExpressionHandler。
二、ifAllGranted、ifAnyGranted和ifNotGranted
這三個屬性的用法相似,它們都接收以逗號分隔的權限列表,且不能使用表達式。ifAllGranted表示須要包含全部的權限,ifAnyGranted表示只須要包含其中的任意一個便可,ifNotGranted表示不能包含指定的任意一個權限。
<!-- 須要擁有全部的權限 -->
<sec:authorize ifAllGranted="ROLE_ADMIN">
<a href="admin.jsp">admin</a>
</sec:authorize>
<!-- 只需擁有其中任意一個權限 -->
<sec:authorize ifAnyGranted="ROLE_USER,ROLE_ADMIN">hello</sec:authorize>
<!-- 不容許擁有指定的任意權限 -->
<sec:authorize ifNotGranted="ROLE_ADMIN">
<a href="user.jsp">user</a>
</sec:authorize>
三、url
url表示若是用戶擁有訪問指定url的權限即表示能夠顯示authorize標籤包含的內容。
<!-- 擁有訪問指定url的權限才顯示其中包含的內容 -->
<sec:authorize url="/admin.jsp">
<a href="admin.jsp">admin</a>
</sec:authorize>
四、method
method屬性是配合url屬性一塊兒使用的,表示用戶應當具備指定url指定method訪問的權限,method的默認值爲GET,可選值爲http請求的7種方法。
<!-- 擁有訪問指定url的權限才顯示其中包含的內容 -->
<sec:authorize url="/admin.jsp">
<a href="admin.jsp">admin</a>
</sec:authorize>
限制訪問方法是經過http元素下的intercept-url元素的method屬性來指定的,如:
<security:intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" method="POST"/>
五、var
用於指定將權限鑑定的結果存放在pageContext的哪一個屬性中。該屬性的主要做用是對於在同一頁面的多個地方具備相同權限鑑定時,咱們只須要定義一次,而後將鑑定結果以var指定的屬性名存放在pageContext中,其它地方能夠直接使用以前的鑑定結果。
<sec:authorize access="isFullyAuthenticated()" var="isFullyAuthenticated">
只有經過登陸界面進行登陸的用戶才能看到1。<br/>
</sec:authorize>
上述權限的鑑定結果是:${isFullyAuthenticated }<br/>
<%if((Boolean)pageContext.getAttribute("isFullyAuthenticated")) {%>
只有經過登陸界面進行登陸的用戶才能看到2。
<%}%>
各屬性對應的優先級
既然咱們能夠經過屬性access、url、ifAllGranted、ifAnyGranted等來指定應當具備的權限,那麼當同時指定多個屬性時,它們的做用效果是什麼樣的呢?authorize標籤進行權限鑑定的屬性根據優先級的不一樣能夠分爲三類,access爲一類;url爲一類;ifAllGranted、ifAnyGranted和ifNotGranted爲一類。這三類將同時只有一類產生效果。它們的優先級以下:
一、access具備最高的優先級,若是指定了access屬性,那麼將以access屬性指定的表達式來鑑定當前用戶是否有權限。無論結果如何,此時其它屬性都將被忽略。
二、若是沒有指定access屬性,那麼url屬性將具備最高優先級,此時將直接經過url屬性和method屬性(默認爲GET)來鑑定當前用戶是否有權限。無論結果如何,此時都將忽略ifAllGranted、ifAnyGranted和ifNotGranted屬性。
三、若是access和url都沒有指定,那麼將使用第三類屬性來鑑定當前用戶的權限。當第三類裏面同時指定了多個屬性時,它們將都發生效果,即必須指定的三類權限都知足才認爲是有對應的權限。如ifAllGranted要求有ROLE_USER的權限,同時ifNotGranted要求不能有ROLE_ADMIN的權限,則結果是它們的並集,即只有擁有ROLE_USER權限,同時不擁有ROLE_ADMIN權限的用戶才被容許獲取指定的內容。
authentication標籤用來表明當前Authentication對象,主要用於獲取當前Authentication的相關信息。authentication標籤的主要屬性是property屬性,咱們能夠經過它來獲取當前Authentication對象的相關信息。如一般咱們的Authentication對象中存放的principle是一個UserDetails對象,因此咱們能夠經過以下的方式來獲取當前用戶的用戶名。
<sec:authentication property="principal.username"/>
固然,咱們也能夠直接經過Authentication的name屬性來獲取其用戶名。
<sec:authentication property="name"/>
property屬性只容許指定Authentication所擁有的屬性,能夠進行屬性的級聯獲取,如「principle.username」,不容許直接經過方法進行調用。
除了property屬性以外,authentication還能夠指定的屬性有:var、scope和htmlScape。
var屬性
var屬性用於指定一個屬性名,這樣當獲取到了authentication的相關信息後會將其以var指定的屬性名進行存放,默認是存放在pageConext中。能夠經過scope屬性進行指定。此外,當指定了var屬性後,authentication標籤不會將獲取到的信息在頁面上進行展現,如需展現用戶應該經過var指定的屬性進行展現,或去掉var屬性。
<!-- 將獲取到的用戶名以屬性名username存放在session中 -->
<sec:authentication property="principal.username" scope="session" var="username"/>
${username }
scope屬性
與var屬性一塊兒使用,用於指定存放獲取的結果的屬性名的做用範圍,默認我pageContext。Jsp中擁有的做用範圍都進行進行指定。
htmlScape屬性
表示是否須要將html進行轉義。默認爲true。
accesscontrollist標籤是用於鑑定ACL權限的。其一共定義了三個屬性:hasPermission、domainObject和var,其中前兩個是必須指定的。hasPermission屬性用於指定以逗號分隔的權限列表;domainObject用於指定對應的域對象;而var則是用以將鑑定的結果以指定的屬性名存入pageContext中,以供同一頁面的其它地方使用。須要注意的是使用accesscontrollist標籤時ApplicationContext中必須存在一個PermissionEvaluator bean,由於accesscontrollist標籤就是經過PermissionEvaluator來鑑定對應的權限的。若是咱們正在使用Spring Security的ACL模塊,那麼PermissionEvaluator一般就對應着AclPermissionEvaluator。此外,若是domainObject屬性指定的domainObject爲null則默認認爲是有權限的,不然若是當前Authentication對象爲null則默認認爲是沒有權限的。
<sec:accesscontrollist hasPermission="1,2" domainObject="${someTargetDomainObject }" >
若是當前Authentication對指定的domainObject擁有指定的hasPermission則將能夠看到這部份內容。
</sec:accesscontrollist>
(注:本文是基於Spring Security3.1.6所寫)