RBAC权限模型,用户权限管理permission实现

目录

一、RBAC权限模型

二、权限记录:

三、关联:

关联到角色: 

关联到用户:

四、查询权限:

五、前后端权限验证:

        定义前端权限验证函数:

        vue页面:

六、结果查看:

1.

2.


一、RBAC权限模型

        RBAC的基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销。

        

二、权限记录:

        RBAC中的权限是由模块和行为合并在一起产生,在这里我将模块表(tb_module)行为表(tb_action)用作权限记录,保存在权限表(tb_permission)中。

tb_module:

tb_action:

tb_permission:

三、关联:

关联到角色: 

 tb_role:

关联到用户:

        这里我叫角色信息设置为tb_user表上的role字段 

四、查询权限:

SELECT p.permission_name
FROM tb_user u
JOIN tb_role r ON JSON_CONTAINS(u.role, CAST(r.id AS CHAR))
JOIN tb_permission p ON JSON_CONTAINS(r.permissions, CAST(p.id AS CHAR))
WHERE u.id = 用户ID AND u.status = 1;

五、前后端权限验证:

        权限验证的工作,前后端都需要去做,后端的权限验证可以交给shiro框架,但前端的验证需要先定义一个权限验证函数,每个页面渲染之前都需要去调用权限验证函数,来判断是否渲染页面。

        定义前端权限验证函数:

        通过从 uni 的本地存储中获取权限数据,并根据传入的权限列表进行匹配,包含该权限返回true,否则返回false。

Vue.prototype.checkPermission = function(perms) {
//从 uni 的本地存储中同步获取用户的权限数据
	let permission = uni.getStorageSync("permission") 
	let result = false
	for (let one of perms) {
		if (permission.indexOf(one) != -1) {
			result = true
			break
		}
	}
	return result
}

        vue页面:

        有对应的权限才能看到对应的“系统管理栏目”。

        通过判断 checkPermission 方法的返回值为 true还是false,如果为true则该 uni-list-item 会显示,反之则隐藏。

六、结果查看:

1.

        我用带有ROOT权限的用户登录查看

2.

        现在将”ROOT“权限改为”ROOT1“,并继续用ROOT权限的用户进行登录查看:

        结果: 发现前两个被更改为ROOT1权限的系统管理栏目没有被查看到,因为用户不具备ROOT1权限

七、权限查询典型sql:

  • 查找特定角色的权限:
<select id="searchRoleOwnPermission" parameterType="int" resultType="HashMap">
  SELECT
    p.id,
    m.module_name AS moduleName,
    a.action_name AS actionName,
    IF(r.id IS NOT NULL, TRUE, FALSE) AS selected
  FROM
    tb_permission p
    JOIN tb_module m ON p.module_id = m.id
    JOIN tb_action a ON p.action_id = a.id
    LEFT JOIN tb_role r ON JSON_CONTAINS(r.permissions, CAST(p.id AS CHAR)) AND r.id = #{id}
  ORDER BY p.module_id, p.id
</select>
  • 查找所有权限: 
<select id="searchAllPermission" resultType="HashMap">
  SELECT
    p.id,
    m.module_name AS moduleName,
    a.action_name AS actionName,
    FALSE AS selected
  FROM
    tb_permission p
    JOIN tb_module m ON p.module_id = m.id
    JOIN tb_action a ON p.action_id = a.id
  ORDER BY p.module_id, p.id
</select>
  •  新增用户时添加权限:
<insert id="insertRole" parameterType="com.example.emos.wx.db.pojo.TbRole">
    INSERT INTO tb_role
    SET role_name=#{roleName},
      permissions=#{permissions}
  </insert>
  • 更新用户的权限:
<update id="updateRolePermissions" parameterType="com.example.emos.wx.db.pojo.TbRole">
    UPDATE tb_role
    SET permissions=#{permissions}
    WHERE id=#{id}
  </update>
  •  查询用户权限:
<select id="searchUserPermissions" resultType="java.lang.String" parameterType="int">
        SELECT p.permission_name
        FROM tb_user u
                 JOIN tb_role r ON JSON_CONTAINS(u.role, CAST(r.id AS CHAR))
                 JOIN tb_permission p ON JSON_CONTAINS(r.permissions, CAST(p.id AS CHAR))
        WHERE u.id = #{userId} AND u.status = 1;
    </select>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值