• 尚筹网05权限控制


    权限控制

    权限控制机制的本质就是用钥匙开锁

    意思就是说,当用户登录之后,之后请求时,需要将请求所需的权限与用户角色所具备的权限进行比对

    Admin分配Role

    目标

    通过页面操作把AdminRole之间的关联关系保存到数据库

    代码:前往分配页面

    创建保存Admin-Role关联关系的数据库表

    CREATE TABLE `inner_admin_role` (
     `id` INT NOT NULL AUTO_INCREMENT, `
      admin_id` INT, 
    `role_id` INT, PRIMARY KEY (`id`) ); 

    这个表并不对应现实生活中或项目业务功能中的一个具体实体,所以没有对应的实体类,也不通过逆向工程生成

    修改分配按钮

    <a href="assign/to/assign/role/page.html?adminId=${admin.id}&pageNum=${requestScope.pageInfo.pageNum}&keyword=${param.keyword}"
       class="btn btn-success btn-xs"><i class=" glyphicon glyphicon-check"></i></a>

    创建assignController

    @RequestMapping("/assign/to/assign/role/page.html")
    public String toAssignPage(@RequestParam("adminId") Integer adminId,
                               ModelMap modelMap) {
        // 查询已分配的角色
        List<Role> assignRoleList = roleService.getAssignedRole(adminId);
        // 查询未分配的角色
        List<Role> unassignRoleLis = roleService.getUnassignedRole(adminId);
    
        // 存入模型
        modelMap.addAttribute("assignRoleList", assignRoleList);
        modelMap.addAttribute("unassignRoleLis", unassignRoleLis);
        return "assign";
    }

    RoleService方法

    @Override
    public List<Role> getAssignedRole(Integer adminId) {
        List<Role> list = roleMapper.selectAssignRole(adminId);
        return list;
    }

    在页面上显示角色数据

    调整表单让表单能够提交数据

    JQuery代码 

    $("#toRightBtn").click(function () {
        // 把左边的第一个未分配追加到右边的第二个
        $("select:eq(0)>option:selected").appendTo("select:eq(1)");
    })
    $("#toleftBtn").click(function () {
        // 把左边的第一个未分配追加到右边的第二个
        $("select:eq(1)>option:selected").appendTo("select:eq(0)");
    })
    //提交表单前,全选,避免选中部分才保存
    $("#submitBtn").click(function () {
        //设置selected属性和值selected
        $("select:eq(1)>option").prop("selected", "selected");
    })

    代码:执行分配

    controller方法

    @RequestMapping("/assign/do/role/assign.html")
    public String saveAdminRoleRelationship(
            @RequestParam("adminId") Integer adminId,
            @RequestParam("pageNum") Integer pageNum,
            @RequestParam("keyword") String keyword,
            //我们允许用户在页面上取消所有已分配角色再提交表单
            //所以可以不提供roleList请求参数
            //设置required=false
            @RequestParam(value = "roleList", required = false) List<Integer> roleIdList
    ) {
        adminService.saveAdminRoleRelationship(adminId, roleIdList);
        return "redirect:/admin/get/page.html?pageNum=" + pageNum + "&keyword=" + keyword;
    }

    service方法

    @RequestMapping("/assign/do/role/assign.html")
    public String saveAdminRoleRelationship(
            @RequestParam("adminId") Integer adminId,
            @RequestParam("pageNum") Integer pageNum,
            @RequestParam("keyword") String keyword,
            //我们允许用户在页面上取消所有已分配角色再提交表单
            //所以可以不提供roleList请求参数
            //设置required=false
            @RequestParam(value = "roleList", required = false) List<Integer> roleIdList
    ) {
        adminService.saveAdminRoleRelationship(adminId, roleIdList);
        return "redirect:/admin/get/page.html?pageNum=" + pageNum + "&keyword=" + keyword;
    }

    修正bug

    Role分配Auth

    目标

    把角色和权限的关联关系保存到数据库

    思路 

    代码:打开模态框

    准备模态框

    <%@include file="/WEB-INF/pages/modal/modal-role-assign-auth.jsp" %>

    注意:要新建jsp文件在写入代码,直接复制文件系统可能会没有识别

    按钮绑定单级响应函数

    fillTableBody()函数中,修改checkBtn

    var checkBtn = "<button id='" + roleId + "' type='button' class='checkBtn btn btn-success btn-xs'><i class=' glyphicon glyphicon-check'></i></button>";

    // 13,给分配权限按钮绑定单机响应函数
    $("#rolePageBody").on("click", ".checkBtn", function () {
        //把当前角色id存入全局变量
         window.roleId = this.id;
        //alert(window.id);
        $("#assignModal").modal("show");
        // 在模态框中显示Auth树形结构
        fillAuthTree();
    });

    加入zTree环境

    <link rel="stylesheet" href="static/ztree/zTreeStyle.css"/>
    <script type="text/javascript" src="static/ztree/jquery.ztree.all-3.5.min.js"></script>
    <%--导入js文件时不能加type="text/javascript"--%>
    <script src="static/commonjs/my-role.js"></script>

    函数fillAuthTree()

    // 模态框中Auth树形结构显示
    function fillAuthTree() {
        var ajaxReturn = $.ajax({
            "url": "assign/get/all/auth.json",
            "type": "post",
            "dataType": "json",
            "async": false
        });
        //响应函数结果中中获取Auth的json数据
        if (ajaxReturn.status !== 200) {
            layer.msg("出错," + ajaxReturn.status + " " + ajaxReturn.statusText)
            return;
        }
        var authList = ajaxReturn.responseJSON.data;
        // 创建json对象存储zTree所做的设置
        // 交给ztree组装
        var setting = {
            "data": {
                "simpleData": {
                    //开启diand简单json功能
                    "enable": true,
                    //设置父节点
                    "pIdKey": "categoryId"
                },
                "key": {
                    //显示的名
                    "name": "title"
                }
            },
            "check": {
                "enable": true
            }
        };
    
        // 生成初始化树结构
        // ,不要写成.
        $.fn.zTree.init($("#authTreeDemo"), setting, authList);
        //默认节点展开
        var zTreeObj = $.fn.zTree.getZTreeObj("authTreeDemo");
        zTreeObj.expandAll(true);
        // 查询已分配的Auth的id组成的数组
    
        ajaxReturn = $.ajax({
            "url": "assign/get/assign/auth/id/by/role/id.json",
            "type": "post",
            "data": {
                "roleId": window.roleId
            },
            "dataType": "json",
            "async": false
        });
        if (ajaxReturn.status != 200) {
            layer.msg("出错," + ajaxReturn.status + " " + ajaxReturn.statusText)
            return;
        }
        // 从响应结果中获取authArray
        var authArray = ajaxReturn.responseJSON.data;
        //alert(authArray);
        // 把对应的树形结构勾选
        // 遍历一下数组
        for (var i = 0; i < authArray.length; i++) {
            var authId = authArray[i];
            // 根据id查询树形结构中的对应节点
            var treeNode = zTreeObj.getNodeByParam("id", authId);
            // 将treeNode设置为被勾选
            var checked = true;//节点勾选
            var checkTypeFlag = false;//不联动,避免父节点勾选,回显多选内容
            zTreeObj.checkNode(treeNode, checked, checkTypeFlag);
        }
    }

    创建角色到权限之间关联关系的中间表

    根据role_id查询auth_id

    Controller

    @ResponseBody
    @RequestMapping("/assign/get/assign/auth/id/by/role/id.json")
    public ResultEntity<List<Integer>> getAssignedAuthIdByRoleId(
            @RequestParam("roleId") Integer roleId
    ) {
        List<Integer> authIdList = authService.getAssignedAuthIdByRoleId(roleId);
        return ResultEntity.sucessWithData(authIdList);
    }

    service方法

    @Autowired
    AuthMapper authMapper;
    @Override
    public List<Integer> getAssignedAuthIdByRoleId(Integer roleId) {
        return authMapper.selectAssignedAuthIdByRoleId(roleId);
    }

    Sql

    <select id="selectAssignedAuthIdByRoleId" resultType="int">
        select auth_id
        from inner_role_auth
        where role_id = #{roleId}
    </select>

    代码:执行分配

    //14、role_auth提交分配数据
    $("#assignBtn").click(function () {
        // 收集被勾选的节点
        var authIdArray = [];
        //获取zTreeObj对象
        var zTreeObj = $.fn.zTree.getZTreeObj("authTreeDemo");
        // 获取被勾选的节点
        var checkedNodes = zTreeObj.getCheckedNodes();
        for (var i = 0; i < checkedNodes.length; i++) {
            var checkedNode = checkedNodes[i];
            var authId = checkedNode.id;
            authIdArray.push(authId);
        }
        // //ok
        // alert(authIdArray);
        alert(window.roleId);
        // 发送执行请求
        var requestBody = {
            "authIdArray": authIdArray,
            // w为了服务器接受统一,设置成数组
            "roleId": [window.roleId]
        }
        console.log(requestBody);
        requestBody = JSON.stringify(requestBody);
        //ok
        // alert(requestBody);
        $.ajax({
                "url": "assign/do/role/assign/auth.json",
                "type": "post",
                "data": requestBody,
                "contentType": "application/json;charset=UTF-8",
                "dataType": "json",
                "success": function (response) {
                    var result = response.result;
                    if (result === "SUCCESS") {
                        // 需要在jqury下面引入layer.js
                        layer.msg("操作成功");
                    }
                    if (result === "FAILED") {
                        layer.msg("操作失败" + response.message);
                    }
                },
                "error": function (response) {
                    layer.msg(response.status + " " + response.statusText);
                }
            }
        );
        $("#assignModal").modal("hide");
    });

    后端执行分配,保存关联关系

    service方法

    @Override
    public void saveRoleAuthRelationship(Map<String, List<Integer>> map) {
    
        //1、获取roleId的值
        List<Integer> roleIdList = map.get("roleId");
        Integer roleId = roleIdList.get(0);
    
        //2、删除就关联关系数据
        authMapper.deleteOldRelationship(roleId);
    
        //3、获取authIdList
        List<Integer> authIdArray = map.get("authIdArray");
    
        //4、判断authList是否有效
        if (authIdArray != null && authIdArray.size()>0){
            authMapper.insertNewRelationship(roleId,authIdArray);
        }
    }

    Mapper

    void insertNewRelationship(Integer roleId, List<Integer> authIdArray);

    Sql

    <insert id="insertNewRelationship" >
        insert into inner_role_auth(auth_id,role_id) values
        <foreach collection="authIdList" item="authId" separator=",">
            (#{authId},#{roleId})
        </foreach>
    </insert>

     

  • 相关阅读:
    Spring 泛型依赖注入
    Spring 注解配置(2)——@Autowired
    Spring bean注解配置(1)
    Spring bean三种创建方式
    Spring中bean的生命周期!
    spring spel表达式语言
    [转]SVN版本冲突解决详解
    [转]Mybatis极其(最)简(好)单(用)的一个分页插件
    [转]Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题
    [转] JPQL
  • 原文地址:https://www.cnblogs.com/Adam-Ye/p/13354837.html
Copyright © 2020-2023  润新知