• 项目一:第十三天 1、菜单数据管理 2、权限数据管理 3、角色数据管理 4、用户数据管理 5、在realm中动态查询用户权限,角色 6、Shiro中整合ehcache缓存权限数据


    课程计划

    菜单数据管理

    权限数据管理

    角色数据管理

    用户数据管理

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

    Shiro中整合ehcache缓存权限数据

     

     

     

     

    菜单数据添加

    2.1 使用combotree父菜单项数据

     

     

    1、 页面:menu_add.jsp

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

     

    3、 使用treegrid组件的方法

     

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

     

    2.2 提交表单

     

     

    2.3 服务端完成保存

     

    Service要做判断:

     

     

    权限数据模块

    添加

    1、页面提交表单

     

     

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

     

    权限分页查询

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

     

     

     

    角色数据模块

    4.1 角色添加

    页面:pages/system/role_add.jsp

     

    实现步骤:

    1、 页面端

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

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

    c) 第三步:提交表单

    2、 服务端

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

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

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

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

    1、发送请求

     

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

     

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

     

    4.1.2 使用ztree展示菜单数据

    回顾ztree两种数据形式:

     

     

     

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

     

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

     

     

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

     

    Action中添加新方法:

     

    Service:

     

     

    4.1.3 提交角色添加表单

    1、 给保存按钮绑定事件

     

     

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

     

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

     

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

     

    增加隐藏域

     

     

    4.1.4 服务端保存角色

    1、 创建三层对象,注入

     

    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 角色列表查询

     

     

     

    用户数据模块

    5.1 用户添加

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

     

    页面:pages/system/user_add.jsp

    页面加载完成后:

     

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

     

     

    5.1.2 提交表单

     

     

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

    Action:

     

    Service:

     

    5.2 用户分页查询

     

     

     

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

    当需要进行权限校验时候:四种方式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缓存(下节课)

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

     

     

    1、 提供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>

     

    2、 配置缓存管理器

     

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

     

  • 相关阅读:
    系统分析师考试
    系统分析师
    软件设计师考试
    海恩法则”的启示:制度不落到实处事故必发
    eclipse下生成Java类图和时序图,生成UML图
    bzoj4010【HNOI2015】菜肴制作
    atitit.提升开发效率---MDA 软件开发方式的革命(5)----列表查询建模
    【数据结构和算法16】堆排序
    这一路走来,冷暖自知 (附算法demos)
    c++实现二叉搜索树
  • 原文地址:https://www.cnblogs.com/shan1393/p/9250736.html
Copyright © 2020-2023  润新知