菜单数据管理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>
二、 配置缓存管理器
三、 将缓存管理器注入安全管理器