自定義(補充)shiro標(biāo)簽

shiro提供了jsp標(biāo)簽用于頁面上的權(quán)限控制撼泛,有hasAnyRoles,hasPermission等標(biāo)簽叔营,但是卻沒提供hasAnyPermission標(biāo)簽鸿吆,有點不大方便雷滚。

這時候我們完全可以仿照shiro的源碼钙态,進行照貓畫虎慧起,擴充一下。

shiro的標(biāo)簽定義文件在shiro-all.jar下的META-INF目錄下的shiro.tld中册倒,打開文件后我們可以看到如下標(biāo)簽的定義:

[html] view plain copy

<embed id="ZeroClipboardMovie_1" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_1" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. <taglib>
  2. <tlib-version>1.1.2</tlib-version>
  3. <jsp-version>1.2</jsp-version>
  4. <short-name>Apache Shiro</short-name>
  5. <uri>http://shiro.apache.org/tags</uri>
  6. <description>Apache Shiro JSP Tag Library.</description>
  7. <tag>
  8. <name>hasPermission</name>
  9. <tag-class>org.apache.shiro.web.tags.HasPermissionTag</tag-class>
  10. <body-content>JSP</body-content>
  11. <description>Displays body content only if the current Subject (user)
  12. 'has' (implies) the specified permission (i.e the user has the specified ability).
  13. </description>
  14. <attribute>
  15. <name>name</name>
  16. <required>true</required>
  17. <rtexprvalue>true</rtexprvalue>
  18. </attribute>
  19. </tag>
  20. <tag>
  21. <name>hasAnyRoles</name>
  22. <tag-class>org.apache.shiro.web.tags.HasAnyRolesTag</tag-class>
  23. <body-content>JSP</body-content>
  24. <description>Displays body content only if the current user has one of the specified roles from a
  25. comma-separated list of role names.
  26. </description>
  27. <attribute>
  28. <name>name</name>
  29. <required>true</required>
  30. <rtexprvalue>true</rtexprvalue>
  31. </attribute>
  32. </tag>
  33. </taglib>

該文件中定義了每個標(biāo)簽的名字和相應(yīng)的標(biāo)簽的實現(xiàn)類蚓挤。我們要補充一個hasAnyPermission的標(biāo)簽,該標(biāo)簽的邏輯和hasAnyRoles有些類似驻子。我們先打開hasAnyRoles的實現(xiàn)類看看灿意,然后照貓畫虎做一個hasAnyPermission的標(biāo)簽。

[java] view plain copy

<embed id="ZeroClipboardMovie_2" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_2" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. package org.apache.shiro.web.tags;
  2. import org.apache.shiro.subject.Subject;
  3. public class HasAnyRolesTag extends RoleTag {
  4. private static final String ROLE_NAMES_DELIMETER = ",";
  5. public HasAnyRolesTag() {
  6. }
  7. protected boolean showTagBody(String roleNames) {
  8. boolean hasAnyRole = false;
  9. Subject subject = getSubject();
  10. if (subject != null) {
  11. for (String role : roleNames.split(ROLE_NAMES_DELIMETER)) {
  12. if (subject.hasRole(role.trim())) {
  13. hasAnyRole = true;
  14. break;
  15. }
  16. }
  17. }
  18. return hasAnyRole;
  19. }
  20. }

以上是hasAnyRolesTag的實現(xiàn)類崇呵,我們仿照這個實現(xiàn)hasAnyPermission:

[java] view plain copy

<embed id="ZeroClipboardMovie_3" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_3" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. package org.apache.shiro.web.tags;
  2. import org.apache.shiro.subject.Subject;
  3. public class HasAnyPermissionTag extends PermissionTag {
  4. private static final long serialVersionUID = 1L;
  5. private static final String PERMISSION_NAMES_DELIMETER = ",";
  6. public HasAnyPermissionTag() {
  7. }
  8. @Override
  9. protected boolean showTagBody(String permissions) {
  10. boolean hasAnyPermission = false;
  11. Subject subject = getSubject();
  12. if (subject != null) {
  13. for (String permission : permissions
  14. .split(PERMISSION_NAMES_DELIMETER)) {
  15. if (subject.isPermitted(permission.trim())) {
  16. hasAnyPermission = true;
  17. break;
  18. }
  19. }
  20. }
  21. return hasAnyPermission;
  22. }
  23. }

將該源代碼編譯成class字節(jié)碼文件缤剧,扔進jar包的\org\apache\shiro\web\tags目錄下
并在jar包里的shiro.tld文件中加入以下代碼指定標(biāo)簽:

[html] view plain copy

<embed id="ZeroClipboardMovie_4" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_4" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. <tag>
  2. <name>hasAnyPermission</name>
  3. <tag-class>org.apache.shiro.web.tags.HasAnyPermissionTag</tag-class>
  4. <body-content>JSP</body-content>
  5. <description>Displays body content only if the current Subject (user)
  6. 'has' (implies) one of the specified permission (i.e the user has the specified ability) form a list of permissions.
  7. </description>
  8. <attribute>
  9. <name>name</name>
  10. <required>true</required>
  11. <rtexprvalue>true</rtexprvalue>
  12. </attribute>
  13. </tag>

OK,搞定域慷,到頁面上測試一下:

[html] view plain copy

<embed id="ZeroClipboardMovie_5" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_5" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. <shiro:hasAnyPermission name="sys_config:policy,
  2. sys_config:server,
  3. sys_config:logdown,
  4. sys_config:keyword,
  5. sys_config:audit,
  6. sys_config:sysinfo">
  7. <li id="4"><a href="javascript:changeMainMenu(4)"><i class="tables"></i>系統(tǒng)配置</a></li>
  8. </shiro:hasAnyPermission>

表示如果當(dāng)前用戶擁有以下權(quán)限的任何一個權(quán)限荒辕,那么該菜單就會顯示汗销,好的,可以了抵窒。

收工弛针。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市估脆,隨后出現(xiàn)的幾起案子钦奋,更是在濱河造成了極大的恐慌,老刑警劉巖疙赠,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件付材,死亡現(xiàn)場離奇詭異,居然都是意外死亡圃阳,警方通過查閱死者的電腦和手機厌衔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捍岳,“玉大人富寿,你說我怎么就攤上這事÷嗉校” “怎么了页徐?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長银萍。 經(jīng)常有香客問我变勇,道長,這世上最難降的妖魔是什么贴唇? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任搀绣,我火速辦了婚禮,結(jié)果婚禮上戳气,老公的妹妹穿的比我還像新娘链患。我一直安慰自己,他們只是感情好瓶您,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布麻捻。 她就那樣靜靜地躺著,像睡著了一般呀袱。 火紅的嫁衣襯著肌膚如雪芯肤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天压鉴,我揣著相機與錄音,去河邊找鬼锻拘。 笑死油吭,一個胖子當(dāng)著我的面吹牛击蹲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婉宰,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歌豺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了心包?” 一聲冷哼從身側(cè)響起类咧,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蟹腾,沒想到半個月后痕惋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡娃殖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年值戳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炉爆。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡堕虹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芬首,到底是詐尸還是另有隱情赴捞,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布郁稍,位于F島的核電站赦政,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艺晴。R本人自食惡果不足惜昼钻,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望封寞。 院中可真熱鬧然评,春花似錦、人聲如沸狈究。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抖锥。三九已至亿眠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磅废,已是汗流浹背纳像。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拯勉,地道東北人竟趾。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓憔购,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岔帽。 傳聞我的和親對象是個殘疾皇子玫鸟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容