Apache Shiro Web應用整合-標籤庫
Apache Shiro 提供了一個JSP/GSP 標籤庫,它允許你控制你的JSP,JSTL 或GSP 頁面基於當前Subject的狀態進行輸出。這對於根據使用者身份和當前使用者的授權狀態來提供個性化檢視是相當有用的。
標籤庫的描述檔案(TLD)儲存在shiro-web.jar裡的META-INF/shiro.tld檔案。要使用任何標籤,需要在你JSP 頁面(或任何你定義的頁面指令)的頂部新增下面一行:
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> |
我們使用shiro 字首用以表明shiro 標籤庫名稱空間,當然你可以指定任何你喜歡的名字。
下面將分別介紹每一個標籤,並展示它是如何用來渲染頁面的。
The guest tag
guest 標籤將顯示它包含的內容,僅噹噹前的Subject 被認為是'guest'時。'guest'是指沒有身份ID 的任何Subject。也就是說,我們並不知道使用者是誰,因為他們沒有登入並且他們沒有在上一次的訪問中被記住(RememberMe 服務)。例如:
<shiro:guest> Hi there! Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a>today! </shiro:guest> |
guest 標籤與user 標籤邏輯相反。
The user tag
user 標籤將顯示它包含的內容,僅噹噹前的Subject 被認為是'user'時。'user'在上下文中被定義為一個已知身份ID的Subject,或是成功通過身份驗證及通過'RememberMe'服務的。請注意這個標籤在語義上與authenticated 標籤是不同的,authenticated 標籤更為嚴格。例如:
<shiro:user> Welcome back John! Not John? Click <a href="login.jsp">here<a> to login. </shiro:user> |
usre 標籤與guest 標籤邏輯相反。
The authenticated tag
僅僅只噹噹前使用者在當前會話中成功地通過了身份驗證authenticated 標籤才會顯示包含的內容。它比'user'標籤更為嚴格。它在邏輯上與'notAuthenticated'標籤相反。
authenticated 標籤只有噹噹前Subject 在其當前的會話中成功地通過了身份驗證才會顯示包含的內容。它比user 標籤更為嚴格,authenticated 標籤通常在敏感的工作流中用來確保身份ID 是可靠的。例如:
<shiro:authenticated> <a href="updateAccount.jsp">Update your contact information</a>. </shiro:authenticated> |
authenticated 標籤與notAuthenticated 標籤邏輯相反。
The notAuthenticated tag
notAuthenticated 標籤將會顯示它所包含的內容,如果當前Subject 還沒有在其當前會話中成功地通過驗證。例如:
<shiro:notAuthenticated> Please <a href="login.jsp">login</a> in order to update your credit card information. </shiro:notAuthenticated> |
notAuthenticated 標籤與Authenticated 標籤邏輯相反。
The principal tag
principal 標籤將會輸出Subject 的主體(標識屬性)或主要的屬性。
若沒有任何標籤屬性,則標籤將使用principal 的toString()值來呈現頁面。例如(假設principal 是一個字串的使用者名稱):
Hello, <shiro:principal/>, how are you today? |
這一般等價於下面:
Hello, <%= SecurityUtils.getSubject().getPrincipal().toString() %>, how are you today? |
principal 標籤預設情況下,假定該principal 輸出的是subject.getPrincipal()的值。但若你想輸出一個不是主要principal的值,而是屬於另一個Subject 的principal collection,你可以通過型別來獲取該principal 並輸出該值。
例如,輸出Subject 的使用者ID(並不是username),假設該ID 屬於principal collection:
User ID: <principal type="java.lang.Integer"/> |
這一般等價於下面:
User ID: <%= SecurityUtils.getSubject().getPrincipals().oneByType(Integer.class).toString() %> |
但如果該principal是一個複雜的物件而不是一個簡單的字串,而且你希望引用該principal 上的一個屬性該怎麼辦呢?你可以使用property 屬性來來表示property 的名稱來理解(必須通過JavaBeans 相容的getter 方法訪問)。例如(假設principal 是一個User 物件):
Hello, <shiro:principal property="firstName"/>, how are you today? |
這一般等價於下面:
Hello, <%= SecurityUtils.getSubject().getPrincipal().getFirstName().toString() %>, how are you today? |
如果結合屬性型別如下:
Hello, <shiro:principal type="com.foo.User" property="firstName"/>, how are you today? |
這一般等價於下面:
Hello, <%= SecurityUtils.getSubject().getPrincipals.oneByType(com.foo.User.class).getFirstName().toString() %>, how areyou today? |
The hasRole tag
hasRole 標籤將會顯示它所包含的內容,僅噹噹前Subject 被分配了具體的角色。例如:
<shiro:hasRole name="administrator"> <a href="admin.jsp">Administer the system</a> </shiro:hasRole> |
hasRole 標籤與lacksRole 標籤邏輯相反。
The lacksRole tag
lacksRole 標籤將會顯示它所包含的內容,僅噹噹前Subject 未被分配具體的角色。例如:
<shiro:lacksRole name="administrator"> Sorry, you are not allowed to administer the system. </shiro:lacksRole> |
lacksRole 標籤與hasRole 標籤邏輯相反。
The hasAnyRole tag
hasAnyRole 標籤將會顯示它所包含的內容,如果當前的Subject 被分配了任意一個來自於逗號分隔的角色名列表中的具體角色。例如:
<shiro:hasAnyRole name="developer, project manager, administrator"> You are either a developer, project manager, or administrater. </shiro:hasAnyRole> |
hasAnyRole 標籤目前還沒有與之邏輯相反的標籤。
The hasPermission tag
hasPermission 標籤將會顯示它所包含的內容,僅噹噹前Subject“擁有”(蘊含)特定的許可權。也就是說,使用者具有特定的能力。例如:
<shiro:hasPermission name="user:create"> <a href="createUser.jsp">Create a new User</a> </shiro:hasPermission> |
hasPermission 標籤與lacksPermission 標籤邏輯相反。
The lacksPermission tag
lacksPermission 標籤將會顯示它所包含的內容,僅噹噹前Subject 沒有擁有(蘊含)特定的許可權。也就是說,使用者沒有特定的能力。例如:
<shiro:lacksPermission name="user:delete"> Sorry, you are not allowed to deleted user accounts. </shiro:hasPermission> |
lacksPermission 標籤與hasPermission 標籤邏輯相反。