上一节的讲的权限拦截是为了处理恶意请求时用到的,正常情况下用户不具备该权限,就不让他看到该操作或页面。这里面涉及到两个部分:
1、如果没有模块权限,菜单就不显示。
2、如果没有功能操作权限,功能按钮或链接就不显示。
模块权限在WebTag.createMenu()这个方法可以控制,下面主要讲功能按钮的操作控制。
新增标签设置webtag.tld
<function>
<description>校验按钮权限</description>
<name>isP</name>
<function-class>com.critc.plat.util.web.WebTag</function-class>
<function-signature>boolean isPrivilege(java.lang.String)</function-signature>
</function>
WebTag.java新增判断按钮权限方法
/**
* 判断按钮权限
*
* @param buttonCode
* @return
*/
public static boolean isPrivilege(String buttonCode) {
SysRoleService sysRoleService = SpringContextHolder.getBean("sysRoleService");
return sysRoleService.checkBtnPrivilege(buttonCode);
}
页面使用
<c:if test="${critc:isP('SysUserAdd')}">
<button type="button" class="btn btn-success btn-sm" id="btnAdd"><i class="ace-icon fa fa-plus bigger-110"></i>新增
</button>
</c:if>
<c:if test="${critc:isP('SysUserUpdate')}">
<a href="toUpdate.htm?id=${sysUser.id }&backUrl=${backUrl}"> 修改 </a>
</c:if>
通过增加标签<c:if test="${critc:isP('SysUserAdd')}">
来判断是否具有该权限,其中SysUserAdd
是在资源管理里面设置的功能按钮的代码,利用<c:if>
来判断是否显示,如果没有权限,该按钮就不会显示了。
缓存的处理
这里需要大量用到缓存处理, 系统的所有权限控制都在SysRoleService
中处理,共有三个cache
1、系统左侧菜单,通过RoleId来生成,cache格式为roleMenu_+roleId
2、系统所有按钮权限,页面显示按钮时使用,cache格式为roleFunctions_+roleId
3、系统能访问资源权限,包括所有资源的url,hashmap数据类型,key为url,value为0/1,,1具有权限,0不具有权限,cache格式为roleResources_+roleId
当修改模块或新增删除模块时,清空所有cache,当角色修改时,清空上述三个对应roleId的cache
仔细分析SysRoleService
这个类的所有方法,就能掌握权限控制的核心。
在修改角色和删除角色的时候,同时清空对应的缓存
public int update(SysRole sysRole, String moduleArr, String functionArr) {
sysRoleDao.update(sysRole);
sysRoleresourceDao.deleteRoleResource(sysRole.getId());
String[] moduleSplit = moduleArr.split("@@");
for (int i = 0; i < moduleSplit.length; i++) {
if (StringUtil.isNotNullOrEmpty(moduleSplit[i])) {
sysRoleresourceDao.addRoleResource(sysRole.getId(), Integer.parseInt(moduleSplit[i]));
}
}
String[] functionSplit = functionArr.split("@@");
for (int i = 0; i < functionSplit.length; i++) {
if (StringUtil.isNotNullOrEmpty(functionSplit[i])) {
sysRoleresourceDao.addRoleResource(sysRole.getId(), Integer.parseInt(functionSplit[i]));
}
}
EhCacheUtil.remove("sysCache", "roleFunctions_" + sysRole.getId());
EhCacheUtil.remove("sysCache", "roleResources_" + sysRole.getId());
EhCacheUtil.remove("sysCache", "roleMenu_" + sysRole.getId());
return 1;
}
这样下次再用到缓存的时候就会重新初始化缓存