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">
- <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>
該文件中定義了每個標(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">
- 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的實現(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">
- 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字節(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">
- <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,搞定域慷,到頁面上測試一下:
[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">
- <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>系統(tǒng)配置</a></li>
- </shiro:hasAnyPermission>
表示如果當(dāng)前用戶擁有以下權(quán)限的任何一個權(quán)限荒辕,那么該菜單就會顯示汗销,好的,可以了抵窒。
收工弛针。