天天看點

【Shiro權限管理】16.Shiro标簽

注:該系列所有測試均在之前建立的Shiro3的Web工程的基礎上。

前面我們剖析了Shiro的授權流程,并且編寫了授權的小執行個體。下面我們來探讨一下Shiro的

标簽。

Shiro提供了JSTL标簽用于在JSP頁面進行權限控制,如根據登入使用者顯示相應的頁面按鈕。

Shiro提供的标簽有如下幾種:

(1) guest标簽:使用者沒有身份驗證時顯示相應資訊,即遊客通路資訊。

例如:

<shiro:guest>
    歡迎遊客通路,<a href="login.jsp" target="_blank" rel="external nofollow" >登入</a>
</shiro:guest>
           

(2) user标簽:使用者已經經過“認證/記住我”登入後顯示相應的資訊。

例如:

<shiro:user>
    歡迎[<shiro:principal/>]登入,<a href="logout" target="_blank" rel="external nofollow" >登出</a>
</shiro:user>
           

(3) authenticated标簽:使用者已經身份驗證通過,即Subject.login,不是“記住我”登入的。

例如:

<shiro:authenticated>
    使用者[<shiro:principal/>]身份驗證已經通過
</shiro:authenticated>
           

(4) notAuthenticated标簽:使用者未進行身份驗證,即沒有調用Subject.login進行登入,包括

“記住我”自動登入的也屬于為進行身份驗證。

例如:

<shiro:notAuthenticated>
    未進行身份驗證(包括記住我)
</shiro:notAuthenticated>
           

(5) principal标簽:顯示使用者身份資訊。預設調用Subject.getPrincipal()擷取,即Primary Principal。

例如:

<shiro:principal property="username"/>
           

這個principal就是在Realm最後傳回的AuthenticationInfo對象中封裝的principal對象,在前面

的執行個體中,我們封裝的是使用者賬号(username)資訊:

【Shiro權限管理】16.Shiro标簽

開發人員可以根據需要,封裝一些使用者的其它資訊為principal,

例如封裝User對象為principal,這樣就可以在頁面中使用principal标簽擷取使用者的一些常用資訊了。

(6) hasRole标簽:如果目前Subject有角色将顯示body體内容。

例如:

<shiro:hasRole name="admin"/>
    使用者[<shiro:principal/>]擁有角色admin<br/>
</shiro:hasRole>
           

(7) hasAnyRoles标簽:如果目前Subject有任意一個角色(或的關系)将顯示body内容。

例如:

<shiro:hasAnyRoles name="admin,user">
    使用者[<shiro:principal/>]擁有角色admin或user<br/>
</shiro:hasAnyRoles>
           

(8) lacksRole:如果目前Subject沒有角色将顯示body體内容。

例如:

<shiro:lacksRole name="admin"/>
    使用者[<shiro:principal/>]沒有角色admin<br/>
</shiro:lacksRole>
           

(9) hasPermission:如果目前Subject有權限将顯示body體内容。

例如:

<shiro:hasPermission name="user:create"/>
    使用者[<shiro:principal/>]擁有權限user:create<br/>
</shiro:hasPermission>
           

(8) lacksPermission:如果目前Subject沒有權限将顯示body體内容。

例如:

<shiro:lacksPermission name="org:create"/>
    使用者[<shiro:principal/>]沒有權限org:create<br/>
</shiro:lacksPermission>
           

下面我們來示範幾個标簽。

首先找到之前名為Shiro3的Web工程下的list.jsp頁面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>首頁</title>
  </head>
  <body>
     登入成功!歡迎<shiro:principal/>通路首頁O(∩_∩)O
   <a href="userAuth/logout" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >登出</a>
   <br/><br/>
   <a href="admin.jsp" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >Admin Page</a>
   <br/><br/>
   <a href="User.jsp" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >User Page</a>
  </body>
</html>
           

在其中的“<%@ page ...”下放置shiro标簽庫:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
           

然後編寫一些标簽,顯示一些資訊:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>首頁</title>
  </head>
  <body>
     登入成功!歡迎通路首頁O(∩_∩)O
   <a href="userAuth/logout" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >登出</a>
   
   <shiro:hasRole name="admin">
   <br/><br/>
   <a href="admin.jsp" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >Admin Page</a>
   </shiro:hasRole>
   
   <shiro:hasRole name="user">
   <br/><br/>
   <a href="User.jsp" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >User Page</a>
   </shiro:hasRole>
   
  </body>
</html>
           

在上面的頁面中,首先歡迎資訊中使用“<shiro:principal/>”顯示使用者名資訊。

而在下面,使用“hasRole”标簽,如果使用者有“admin”角色,則顯示“Admin Page”的超連結,

如果使用者有“user”角色,則顯示“User Page”的超連結。

下面驗證一下結果,首先使用普通使用者“jack”登入測試系統:

【Shiro權限管理】16.Shiro标簽

進入首頁後,因為jack隻有“user”角色,是以可以看到隻顯示了“User Page”的超連結。

【Shiro權限管理】16.Shiro标簽

而下面使用administrator使用者登入測試系統:

【Shiro權限管理】16.Shiro标簽

進入首頁後,因為administrator有“user”和“admin”角色,是以兩個都能看到:

【Shiro權限管理】16.Shiro标簽

以上就是Shiro提供的頁面标簽。

轉載請注明出處:http://blog.csdn.net/acmman/article/details/78765267

繼續閱讀