1. 程式人生 > >自定義(補充)shiro標籤

自定義(補充)shiro標籤

shiro提供了jsp標籤用於頁面上的許可權控制,有hasAnyRoles,hasPermission等標籤,但是卻沒提供hasAnyPermission標籤,有點不大方便。

這時候我們完全可以仿照shiro的原始碼,進行照貓畫虎,擴充一下。

shiro的標籤定義檔案在shiro-all.jar下的META-INF目錄下的shiro.tld中,開啟檔案後我們可以看到如下標籤的定義:

<taglib>
  <tlib-version>1.1.2</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>Apache Shiro</short-name>
  <uri>http://shiro.apache.org/tags</uri>
  <description>Apache Shiro JSP Tag Library.</description>
  <tag>
    <name>hasPermission</name>
    <tag-class>org.apache.shiro.web.tags.HasPermissionTag</tag-class>
    <body-content>JSP</body-content>
    <description>Displays body content only if the current Subject (user)
      'has' (implies) the specified permission (i.e the user has the specified ability).
    </description>
    <attribute>
      <name>name</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  <tag>
    <name>hasAnyRoles</name>
    <tag-class>org.apache.shiro.web.tags.HasAnyRolesTag</tag-class>
    <body-content>JSP</body-content>
    <description>Displays body content only if the current user has one of the specified roles from a
      comma-separated list of role names.
    </description>
    <attribute>
      <name>name</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>
該檔案中定義了每個標籤的名字和相應的標籤的實現類。我們要補充一個hasAnyPermission的標籤,該標籤的邏輯和hasAnyRoles有些類似。我們先開啟hasAnyRoles的實現類看看,然後照貓畫虎做一個hasAnyPermission的標籤。
package org.apache.shiro.web.tags;
import org.apache.shiro.subject.Subject;
public class HasAnyRolesTag extends RoleTag {
    private static final String ROLE_NAMES_DELIMETER = ",";
    public HasAnyRolesTag() {
    }
    protected boolean showTagBody(String roleNames) {
        boolean hasAnyRole = false;
        Subject subject = getSubject();
        if (subject != null) {
            for (String role : roleNames.split(ROLE_NAMES_DELIMETER)) {
                if (subject.hasRole(role.trim())) {
                    hasAnyRole = true;
                    break;
                }
            }
        }
        return hasAnyRole;
    }
}

以上是hasAnyRolesTag的實現類,我們仿照這個實現hasAnyPermission:
package org.apache.shiro.web.tags;
import org.apache.shiro.subject.Subject;
public class HasAnyPermissionTag extends PermissionTag {
	private static final long serialVersionUID = 1L;
	private static final String PERMISSION_NAMES_DELIMETER = ",";
	public HasAnyPermissionTag() {
	}
	@Override
	protected boolean showTagBody(String permissions) {
		boolean hasAnyPermission = false;
		Subject subject = getSubject();
		if (subject != null) {
			for (String permission : permissions
					.split(PERMISSION_NAMES_DELIMETER)) {
				if (subject.isPermitted(permission.trim())) {
					hasAnyPermission = true;
					break;
				}
			}
		}
		return hasAnyPermission;
	}
}
將該原始碼編譯成class位元組碼檔案,扔進jar包的\org\apache\shiro\web\tags目錄下
並在jar包裡的shiro.tld檔案中加入以下程式碼指定標籤:
  <tag>
    <name>hasAnyPermission</name>
    <tag-class>org.apache.shiro.web.tags.HasAnyPermissionTag</tag-class>
    <body-content>JSP</body-content>
    <description>Displays body content only if the current Subject (user)
      'has' (implies) one of the specified permission (i.e the user has the specified ability) form a list of permissions.
    </description>
    <attribute>
      <name>name</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
OK,搞定,到頁面上測試一下:
<shiro:hasAnyPermission name="sys_config:policy,
				sys_config:server,
				sys_config:logdown,
				sys_config:keyword,
				sys_config:audit,
				sys_config:sysinfo">
	<li id="4"><a href="javascript:changeMainMenu(4)"><i class="tables"></i>系統配置</a></li>
</shiro:hasAnyPermission>

表示如果當前使用者擁有以下許可權的任何一個許可權,那麼該選單就會顯示,好的,可以了。

收工。


相關推薦

定義補充shiro標籤

shiro提供了jsp標籤用於頁面上的許可權控制,有hasAnyRoles,hasPermission等標籤,但是卻沒提供hasAnyPermission標籤,有點不大方便。 這時候我們完全可以仿照shiro的原始碼,進行照貓畫虎,擴充一下。 shiro的標籤定義檔案在sh

Apache Shiro——Shiro 標籤與許可權註解

一、Shiro 標籤 Shiro 提供了 JSTL 標籤用於在 JSP 頁面進行許可權控制,如根據登入使用者顯示相應的頁面按鈕。 guest 標籤:使用者沒有身份驗證時顯示相應資訊,即遊客訪問資訊。 user 標籤:使用者已經經過認證/記住我登入後顯示相應的資訊。 authe

百度地圖的覆蓋物定義--資訊視窗的定義呼叫白茹提供的資訊視窗InfoWindow

百度地圖的覆蓋物自定義(而)--資訊視窗的自定義(呼叫白茹提供的資訊視窗InfoWindow) var point=new BMap.Point(111.54525,45.578); setInfo

Docker映象的修改和定義

一、docker映象的更新 (1)啟動映象,寫入一些檔案或者更新軟體 docker run -it 3afd47092a0e [[email protected] /]# ls (2)更新映象 docker commit -m="test update" -a="

Android定義xml屬性,定義組合控制元件

原文連結  本文是在“劍蕭舞蝶”的“Android中View自定義組合控制元件的基本編寫方法”的基礎上進行修正而來的。按照原作者的說發和程式碼來寫自定義控制元件,結果使用的時候出了不少問題。我之前對於這塊完全沒有去接觸,又看到有人說網上的例子都是大同小異,很多細節也沒有說清

BaseExpandableListAdapter,二級列表的完全定義

普通的ListView已經無法滿足需要,下面來詳細說明如何使用二級列表,二級列表有很多地方會使用到,如常見的QQ好友分組,效果圖如下: 具體的內容包括表頭和表體,點選表頭會展開或合併表體,為方便表示,表頭和表體均為圖片加文字的佈局。 分析完成二級列表需要的一些東西: 一:

控制器轉場動畫定義2:modal/dismiss的實現

大家好,我是KK黃凱展,這次繼上篇的push/pop轉場動畫自定義後,我們把目標瞄準modal和dismiss這兩個傢伙,照舊,還是先把效果圖和預設搬出來給大家look一look~ 這是預設modal和dismiss的效果 這是自定義push和po

Django 筆記模板標籤 ~ 定義過濾器

模板標籤: 標籤在渲染的過程中提供任意的邏輯 語法: 由{% ... %} 和 {% end... %}   常用標籤:      with:類似取別名     模版繼承: Django模版引擎中最強大也是最

springbootshiro安全框架定義過濾器出現的幾個疑難雜症解決方案

問題一:多次重複重定向問題(匹配多個過濾器鏈重複呼叫其對應過濾器) 問題二:shiro認證時Realm會執行兩次 在使用springboot框架整合shiro安全認證框架時踩了很多坑,每次出問題網上都找不到其中的解決方案,這裡貼兩個我遇到的坑,以及其解決方案給大家,希望大

Shiro——Shiro定義Realm

Realm: 域。Shiro 從從 Realm 獲取安全資料(如使用者、角色、許可權),就是說 SecurityManager 要驗證使用者身份,那麼它需要從 Realm 獲取相應的使用者進行比較以確定使用者身份是否合法;也需要從 Realm 得到使用者相應的角色 / 許可權進行驗證使用者是否能進行

百度UEditor定義上傳檔案儲存路徑補充

上一篇百度UEditor自定義上傳檔案儲存路徑發表後,再解決了線上管理、線上圖片和線上附件功能不能使用的問題。 需要修改FileManager類: 註釋掉的程式碼是原來jar包的程式碼,不再需要,可以刪除掉。 //private String di

jQuery基礎鼠標事件,表單事件,鍵盤事件,定義事件 篇

1.7 傳遞 ret 文本 leave 右鍵 page content gree 1.jQuery鼠標事件之click與dbclick事件 方法一:$ele.click()(不帶參數) <div id="test">點擊觸發<div> $(

python第九天定義函數

但是 程序 turn return 默認 自定義 括號 none for 一、.函數:     如果檢測一個元素的長度用len非常簡單,也可以寫個循環來做。 s = ‘asd‘ def my_len(): i = 0 for k in s:

ASP.NET WebApi OWIN 實現 OAuth 2.0定義獲取 Token

href timespan 獲取 edi prot cep b- med 2-0 相關文章:ASP.NET WebApi OWIN 實現 OAuth 2.0 之前的項目實現,Token 放在請求頭的 Headers 裏面,類似於這樣: Accept: application

博客園樣式定義待更新

ava white tde 百度一下 padding element win timer rip 總感覺這件事情做的晚了哈哈。 以前寫博客總是一個人默默地寫,現在竟然出現了兩個吐槽我挖坑不填的哈哈。(非常感謝~) 大概是終於有個人能夠督促自己學習了,你們怎麽不早點來?!!

idea+maven + spring security +springmvc入門 定義登入頁面,附idea如何建立web專案

第一次使用idea,上午在eclipse中 學習了spring security 入門,下午試試在idea中搭建。 剛開始 我以為 直接將eclipse的 檔案 copy過來就行了,結果發現copy過來以後 各種報錯。 後來把m

Android應用--簡 美音樂播放器獲取專輯圖片定義列表介面卡

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

web前端4—— 常用標籤1 洗禮靈魂,修煉python55--爬蟲篇—知識補充—RFC 2616 http狀態碼

標題標籤h1~h6 顧名思義,這些就是把字型設定為大字型的,就如部落格園的這個編輯器裡的格式:   不信的話我們自己設定看看:好的,從本篇文章開始,我們需要動手了   <!DOCTYPE html> <html lang="en"> <

iOS 底部按鈕 工具欄 Tabbar 及 Tabbar 的定義中間突出

大多數應用使用系統自帶的Tabbar就能夠滿足需求 通常情況都是在AppDelegate.m裡建立一個UITabBarController將其它的控制器用UINavigationController包裝一層,再新增到UITabBarController的viewControllers裡。再將UI

skill——zbbix低級別發現 與 zabbix 定義監控項

低級別發現Low-level discovery(LLD) 在對主機的監控中,可能出現這樣的情況,例如對某主機網絡卡eth0進行監控,可以指定需要監控的網絡卡是 eth0,而將網絡卡作為一個通用監控項時,根據主機作業系統的不同,網絡卡的名稱也不完全相同,有些作業系統的網絡卡名稱是 eth 開頭的,而有些