在使用Shiro定义的JSP标签时,难免会遇到现有标签无法满足实际需求的状况,比如:
用户如果有添加、修改用户的权限,而没有删除用户的权限,我们就显示添加、修改用户这个菜单,不显示删除用户的菜单。
即利用自定义JSP标签来实现权限菜单的细力度控制。所谓的细粒度控制,就是根据用户权限的不同,显示不同的菜单。
自定义Shiro的JSP标签步骤:
1.创建继承自 PermissionTag 或 RoleTag
public class HasAllPermssionTag extends PermissionTag {
private static final long serialVersionUID = 4463286655483901134L;
public HasAllPermssionTag() {
}
@Override
protected boolean showTagBody(String permssions) {
// 是否具有所有权限
boolean hasAllPermssion = false;
String [] permssionsArray = permssions.split(",");
Subject subject = getSubject(); // 获取主体
if(subject != null) {
for(String permssion : permssionsArray) {
// 分别验证
if(subject.isPermitted(permssion.trim())) {
hasAllPermssion = true;
}else {
hasAllPermssion = false;
}
}
}
return hasAllPermssion;
}
}
2.新建.tld文件
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.1.2</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>Apache Shiro</short-name>
<uri>/customshiro</uri>
<description>Apache Shiro JSP Tag Library.</description>
<tag>
<name>hasAllPermssion</name>
<tag-class>hczj.security.HasAllPermssionTag</tag-class>
<body-content>JSP</body-content>
<description></description>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>hasAnyRoles</name>
<tag-class>hczj.security.HasAnyPermssionTag</tag-class>
<body-content>JSP</body-content>
<description>...</description>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3.在web.xml设置我们自定义的标签路径
<jsp-config>
<taglib>
<taglib-uri>/customshiro</taglib-uri>
<taglib-location>/WEB-INF/tags/customshiro.tld</taglib-location>
</taglib>
</jsp-config>
4.在.jsp页面上,我们只需要引入我们自定义的标签库,并在需要控制的html标签外套用我们的权限标签即可。如:
<%@ taglib prefix="custom" uri="/customshiro"%>
<custom:hasAllPermssion name="modeltype:insert, modeltype:delete, modeltype:update, modeltype:query">
<ul class="dropdown-menu">
<li><a href="${basePath}/modelType/modelTypeList">类型列表</a></li>
<li role="separator" class="divider"></li>
<li><a href="${basePath}/modelType/add">类型添加</a></li>
</ul>
</custom:hasAllPermssion>