上一節(jié)的講的權(quán)限攔截是為了處理惡意請求時(shí)用到的扒吁,正常情況下用戶不具備該權(quán)限,就不讓他看到該操作或頁面隶垮。這里面涉及到兩個(gè)部分:
1藻雪、如果沒有模塊權(quán)限,菜單就不顯示狸吞。
2勉耀、如果沒有功能操作權(quán)限指煎,功能按鈕或鏈接就不顯示。
模塊權(quán)限在WebTag.createMenu()這個(gè)方法可以控制便斥,下面主要講功能按鈕的操作控制至壤。
新增標(biāo)簽設(shè)置webtag.tld
<function>
<description>校驗(yàn)按鈕權(quán)限</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新增判斷按鈕權(quán)限方法
/**
* 判斷按鈕權(quán)限
*
* @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>
通過增加標(biāo)簽<c:if test="${critc:isP('SysUserAdd')}">
來判斷是否具有該權(quán)限,其中SysUserAdd
是在資源管理里面設(shè)置的功能按鈕的代碼枢纠,利用<c:if>
來判斷是否顯示像街,如果沒有權(quán)限,該按鈕就不會顯示了晋渺。
緩存的處理
這里需要大量用到緩存處理镰绎, 系統(tǒng)的所有權(quán)限控制都在SysRoleService
中處理,共有三個(gè)cache
1木西、系統(tǒng)左側(cè)菜單畴栖,通過RoleId來生成,cache格式為roleMenu_+roleId
2八千、系統(tǒng)所有按鈕權(quán)限吗讶,頁面顯示按鈕時(shí)使用,cache格式為roleFunctions_+roleId
3恋捆、系統(tǒng)能訪問資源權(quán)限照皆,包括所有資源的url,hashmap數(shù)據(jù)類型沸停,key為url纵寝,value為0/1,,1具有權(quán)限星立,0不具有權(quán)限,cache格式為roleResources_+roleId
當(dāng)修改模塊或新增刪除模塊時(shí)葬凳,清空所有cache绰垂,當(dāng)角色修改時(shí),清空上述三個(gè)對應(yīng)roleId的cache
仔細(xì)分析SysRoleService
這個(gè)類的所有方法火焰,就能掌握權(quán)限控制的核心劲装。
在修改角色和刪除角色的時(shí)候,同時(shí)清空對應(yīng)的緩存
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;
}
這樣下次再用到緩存的時(shí)候就會重新初始化緩存