菜單數據管理java
權限數據管理ajax
角色數據管理json
用戶數據管理緩存
在realm中動態查詢用戶權限,角色安全
Shiro中整合ehcache緩存權限數據框架
一、 頁面:menu_add.jspjsp
二、 修改組件樣式:easyui-combotree,修改url 樹型表格treeGrid跟下來數combotree要求數據格式基本一致。 Combotree經過text屬性展現文本。ui
三、 使用treegrid組件的方法url
四、 問題:返回數據中沒有顯示文本內容:解決spa
Service要作判斷:
1、頁面提交表單
2、建立三層對象,服務端添加保存方法
注意:頁面datagrid增長分頁條屬性,自適應屬性
頁面:pages/system/role_add.jsp
實現步驟:
一、 頁面端
a) 第一步:使用複選框checkbox展現權限數據
b) 第二步:使用ztree以簡單數據格式展現菜單數據
c) 第三步:提交表單
二、 服務端
a) 第一步:保存角色數據
b) 第二步:角色關聯權限
c) 第三步:角色關聯菜單
1、發送請求
2、在權限action中添加查詢全部的權限數據
3、在頁面中ajax回調解析數據
回顧ztree兩種數據形式:
直接使用以前添加方法:listjax返回的數據json的標準數據格式。
--修改成返回數據是簡單數據格式。
爲了返回json中包含pId屬性。故在實體中增長對應的get方法:
Action中添加新方法:
Service:
一、 給保存按鈕綁定事件
二、 問題:選中ztree組件中數據沒有提交:緣由:節點數據不是checkbox,本質是span只是在動態修改樣式
三、 解決:查詢ztree API獲取勾選中記錄的方法:注意調用ztree的方法必須先獲取到ztree對象
提交表單:須要在form表單中設置隱藏域:存放選中菜單id
增長隱藏域
一、 建立三層對象,注入
二、 Service
/**
* @Description: 1、保存角色 2、角色關聯菜單123,345 3、角色關聯權限
* @return
*/
public void save(Role model, String menuIds, Integer[] permissionIds) {
//保存完角色對象:持久態
roleDao.save(model);
//角色關聯菜單
if(StringUtils.isNotBlank(menuIds)){
String[] strings = menuIds.split(",");
for (String menuId : strings) {
Menu menu = menuDao.findOne(Integer.parseInt(menuId));
//持久態關聯持久態
model.getMenus().add(menu); //向中間表T_role_menu添加記錄
}
}
//角色關聯權限
if(permissionIds!=null && permissionIds.length>0){
for (Integer permissionId : permissionIds) {
Permission permission = new Permission();
permission.setId(permissionId);//託管態 TODO 也能夠根據ID調用dao查詢到持久態權限對象
//持久態關聯託管態
model.getPermissions().add(permission);//向中間表T_role_permission添加記錄
}
}
}
頁面:pages/system/user_add.jsp
頁面加載完成後:
服務端調用角色列表展現請求;
Action:
Service:
當須要進行權限校驗時候:四種方式url攔截、註解、頁面標籤、代碼級別,當須要驗證權限會調用realm中的受權方法:
/**
* @Description: 給當前用戶受權
* 使用shiro提供url攔截方式,調用此方法查詢用戶權限,角色
* 使用shiro提供註解方式,調用此方法查詢用戶權限,角色
* 使用shiro提方頁面標籤方式,調用此方法查詢用戶權限,角色
* @return
*/
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
List<Role> roleList = null;
List<Permission> permissionList = null;
System.out.println("驗證用戶是否有權限---給用戶受權");
//建立受權信息對象
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//動態根據用戶id查詢權限角色。
//若是內置管理員帳戶 擁有全部角色,全部的權限
User user = (User) SecurityUtils.getSubject().getPrincipal();
if(user.getUsername().equals("admin")){
roleList = roleDao.findAll();
permissionList = permissionDao.findAll();
}else{
//若是是其餘普通用戶 根據ID動態查詢
roleList = roleDao.findByUserId(user.getId());
permissionList = permissionDao.findByUserId(user.getId());
}
if(permissionList!=null && permissionList.size()>0){
for (Permission permission : permissionList) {
info.addStringPermission(permission.getKeyword()); //addStringPermission不能爲null或者空字符串
}
}
if(roleList!=null && roleList.size()>0){
for (Role role : roleList) {
info.addRole(role.getKeyword());
}
}
return info;
}
Dao:
Shiro框架內部整合好ehcache環境,只須要配置便可。
一、 提供ehcache緩存配置文件
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!-- 磁盤數據臨時目錄 -->
<diskStore path="java.io.tmpdir"/>
<!-- maxElementsInMemory:內存中存儲數據最大個數
eternal:是否永久有效
timeToIdleSeconds:內存中對象空閒時間,單位秒
maxElementsOnDisk:磁盤中最大存儲個數
timeToLiveSeconds:內存中對象存活時間,單位秒
diskExpiryThreadIntervalSeconds:指定清除內存數據線程執行時間週期
memoryStoreEvictionPolicy:清除數據策略: LRU:最近最少使用 FIFO:先進先出
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
</ehcache>
二、 配置緩存管理器
三、 將緩存管理器注入安全管理器