1 课程计划

菜单数据管理

权限数据管理

角色数据管理

用户数据管理

在realm中动态查询用户权限,角色

Shiro中整合ehcache缓存权限数据

5b81a2dd64aa139f5afaa4fd4c4954ed.png

2 菜单数据添加

2.1 使用combotree父菜单项数据

33345cae18e6c0cae145dd89baf3f993.png

703d7c3190d8405adc938648a0208686.png

1、 页面:menu_add.jsp

2、 修改组件样式:easyui-combotree,修改url树型表格treeGrid跟下来数combotree要求数据格式基本一致。Combotree通过text属性展示文本。

6624ecbf5bb3775d3a6b1983f62aa272.png

3、 使用treegrid组件的方法

4、 问题:返回数据中没有显示文本内容:解决

000a4a693f5d961726d7c875bc03044b.png

2.2 提交表单

65c7a1a72f5bd2828fe07d58ab615ca2.png

678faf896d8279b2ada15b00202aced4.png

2.3 服务端完成保存

159c8bc5e0591697222f15357b4af9f7.png

Service要做判断:

af9a10b2dc3a69e36a4b45b08ec8a2c2.png

3 权限数据模块

添加

1、页面提交表单

1ac6cd0a3c9eddf62dab7b37b06ea3dc.png

60badec71a0c62e12e55712811c77013.png

2、创建三层对象,服务端添加保存方法

8a001fc9e6fb946f49a8616a8749e8ee.png

权限分页查询

注意:页面datagrid增加分页条属性,自适应属性

dbeac83ce46a0a21647b11590d644302.png

c2cfce365ea34a0495012320bd47d059.png

4 角色数据模块

4.1 角色添加

页面:pages/system/role_add.jsp

实现步骤:

1、 页面端

a) 第一步:使用复选框checkbox展示权限数据

b) 第二步:使用ztree以简单数据格式展示菜单数据

c) 第三步:提交表单

2、 服务端

a) 第一步:保存角色数据

b) 第二步:角色关联权限

c) 第三步:角色关联菜单

4.1.1 使用复选框展示权限数据

1、发送请求

af1ecb8ea713414110bf6d6d8f1e32de.png

2、在权限action中添加查询所有的权限数据

41e5e37d4a1aab89d0f9fbd0cc6f5892.png

3、在页面中ajax回调解析数据

4.1.2 使用ztree展示菜单数据

回顾ztree两种数据形式:

7f498b2ef67ff472f537975e50887619.png

298039efe49ea330bbde1ad50b74bfb2.png

直接使用之前添加方法:listjax返回的数据json的标准数据格式。

--修改为返回数据是简单数据格式。

a4cb52b040612954137ac45b038e83b9.png

为了返回json中包含pId属性。故在实体中增加对应的get方法:

ecb9b8fd33de7d36e2857025cd52133a.png

Action中添加新方法:

f822cbcf0c47783d99f582bf49db7b7e.png

Service:

7b845f95d46fec3de82a147d9f5af778.png

4.1.3 提交角色添加表单

1、 给保存按钮绑定事件

ad6d3d056b4546537200608c9be80942.png

14d70f19a2e8eba86548ba2b453fb768.png

2、 问题:选中ztree组件中数据没有提交:原因:节点数据不是checkbox,本质是span只是在动态修改样式

3、 解决:查询ztree API获取勾选中记录的方法:注意调用ztree的方法必须先获取到ztree对象

56b76b530cd6ce9af8a225b082ab9264.png

提交表单:需要在form表单中设置隐藏域:存放选中菜单id

87cde4652d29f4701583aabc78917353.png

增加隐藏域

af45741e5123510a5841bbbeddc5c024.png

155975a3ba8012e85525e05989dd6930.png

4.1.4 服务端保存角色

1、 创建三层对象,注入

84a8dee0e95ac52463c1b88a29572e70.png

2、 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添加记录

}

}

}

4.2 角色列表查询

0eeeb7c287c0f6e833d42797c6257400.png

4022b1a5335214580d3c3af70024275a.png

5 用户数据模块

5.1 用户添加

5.1.1 使用复选框展示角色数据

页面:pages/system/user_add.jsp

页面加载完成后:

2f440860fa972990299d42de3bf3aca2.png

服务端调用角色列表展示请求;

5.1.2 提交表单

bb013fcf96549eb72801f9466ec09ecf.png

ef35889ea300f3c879e1cde61ef7444c.png

5.1.3 服务端完成保存用户;关联角色

Action:

7012bce5ccb00a0a41036768a6d3c437.png

Service:

785f9b36fc6f393afab4cf538e489ace.png

5.2 用户分页查询

4c81f63b48efc8e6d7228b8f3aeca222.png

6 在realm中动态查询用户的权限,角色

当需要进行权限校验时候:四种方式url拦截、注解、页面标签、代码级别,当需要验证权限会调用realm中的授权方法:

/**

* @Description: 给当前用户授权

* 使用shiro提供url拦截方式,调用此方法查询用户权限,角色

* 使用shiro提供注解方式,调用此方法查询用户权限,角色

* 使用shiro提方页面标签方式,调用此方法查询用户权限,角色

* @return

*/

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

List roleList = null;

List 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:

ddf5b9f98d607039a1dddcd5f92c68aa.png

3f5a4fa10bae18858ac02e270d719fe0.png

7 Shiro整合ehCache缓存(下节课)

Shiro框架内部整合好ehcache环境,只需要配置即可。

fcd47b82200e37736024776dbb9f5111.png

1、 提供ehcache缓存配置文件

maxElementsInMemory="10000"

eternal="false"

timeToIdleSeconds="120"

timeToLiveSeconds="120"

maxElementsOnDisk="10000000"

diskExpiryThreadIntervalSeconds="120"

memoryStoreEvictionPolicy="LRU">

2、 配置缓存管理器

f8f2d8717bc4afbde0a160cc468d84fe.png

3、 将缓存管理器注入安全管理器

94cc9195af1c8f59bdd128bb77c75b21.png

原文:https://www.cnblogs.com/shan1393/p/9250736.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐