目錄
1.1?????authorize
1.2?????authentication
1.3?????accesscontrollist
?
?????? Spring Security也有對Jsp標簽的支持的標簽庫。其中一共定義了三個標簽:authorize、authentication和accesscontrollist。其中authentication標簽是用來代表當前Authentication對象的,我們可以利用它來展示當前Authentication對象的相關信息。另外兩個標簽是用于權限控制的,可以利用它們來包裹需要保護的內容,通常是超鏈接和按鈕。
???????如果需要使用Spring Security的標簽庫,那么首先我們應當將對應的jar包spring-security-taglibs-xxx.jar放入WEB-INF/lib下;其次我們需要在頁面上引入Spring Security的標簽庫。
<%@?taglib?prefix="sec"?uri="http://www.springframework.org/security/tags"?%>
???????接下來就可以在頁面上自由的使用Spring Security的標簽庫提供的標簽了。
?
1.1?????authorize
?????? authorize是用來判斷普通權限的,通過判斷用戶是否具有對應的權限而控制其所包含內容的顯示,其可以指定如下屬性。
?????? 1、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。
?
?????? 2、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>
?
?????? 3、url
?????? url表示如果用戶擁有訪問指定url的權限即表示可以顯示authorize標簽包含的內容。
???<!--?擁有訪問指定url的權限才顯示其中包含的內容?-->
???<sec:authorize?url="/admin.jsp">
??????<a?href="admin.jsp">admin</a>
???</sec:authorize>
?
?????? 4、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"/>??
?
?????? 5、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為一類。這三類將同時只有一類產生效果。它們的優先級如下:
?????? 1、access具有最高的優先級,如果指定了access屬性,那么將以access屬性指定的表達式來鑒定當前用戶是否有權限。不管結果如何,此時其它屬性都將被忽略。
?????? 2、如果沒有指定access屬性,那么url屬性將具有最高優先級,此時將直接通過url屬性和method屬性(默認為GET)來鑒定當前用戶是否有權限。不管結果如何,此時都將忽略ifAllGranted、ifAnyGranted和ifNotGranted屬性。
?????? 3、如果access和url都沒有指定,那么將使用第三類屬性來鑒定當前用戶的權限。當第三類里面同時指定了多個屬性時,它們將都發生效果,即必須指定的三類權限都滿足才認為是有對應的權限。如ifAllGranted要求有ROLE_USER的權限,同時ifNotGranted要求不能有ROLE_ADMIN的權限,則結果是它們的并集,即只有擁有ROLE_USER權限,同時不擁有ROLE_ADMIN權限的用戶才被允許獲取指定的內容。
?
1.2?????authentication
?????? 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。
?
1.3?????accesscontrollist
?????? 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所寫)
?