目录
一、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>