RBAC基于角色的权限管理

Wesley13
• 阅读 645

RBAC基于角色的权限管理--设计篇1.1

RBAC基于角色的权限管理--设计篇1.0

https://my.oschina.net/xiaozhutefannao/blog/1600612

权限控制

数据权限

场景

有些业务可能会是这样。一个列表(或表格),要求普通用户只能看到自己创建的列表信息,业务部门经理只能看到本部门的所有列表信息。这种权限如何控制?

表设计

部门表
CREATE TABLE `t_dept` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(255) DEFAULT NULL COMMENT '部门名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
工单表(列表信息模拟)
CREATE TABLE `t_gd` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '工单ID',
  `name` varchar(255) DEFAULT NULL COMMENT '工单名称',
  `creater` int(10) DEFAULT NULL COMMENT '创建人',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
用户部门关系表(这里为了不破坏之前的表设计,在t_user中添加deptid也可以)
CREATE TABLE `t_user_dept` (
  `userid` int(10) NOT NULL COMMENT '用户ID',
  `deptid` int(10) NOT NULL COMMENT '部门ID',
  PRIMARY KEY (`userid`,`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

常见处理方式-代码写死

就以我说的简单场景为例。看到自己创建的列表信息无非就是

select * from t_gd where creater = xxx

业务部门经理只能看到本部门的所有列表信息无非就是

SELECT
    t1. NAME
FROM
    t_gd t1,
    t_user t2,
    t_user_dept t3
WHERE
    t1.creater = t2.id
AND t2.id = t3.userid
AND t3.deptid = '业务部门经理的部门id'

在java代码中,做好if-else判断,也算完成了这个小任务。

用表做关联处理

显而易见,上面的方式有点“硬编码”,你的PM or 小老板表示很不满意,“这给我们的维护带来的巨大的工作量”,“我觉得这不行”,“我觉得你可以不用来了(作者开个玩笑)”

那么问题来了,如何解决这个所谓的“硬编码”问题?

数据权限表
CREATE TABLE `t_permission_data` (
  `id` int(10) NOT NULL COMMENT '主键ID',
  `gd_creater` int(10) DEFAULT NULL COMMENT '工单创建人',
  `gd_creater_deptid` int(10) DEFAULT NULL COMMENT '工单创建人部门id',
  `roleid` int(10) DEFAULT NULL COMMENT '角色id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表说明 : 某个角色可以看到工单下某个用户创建的数据或用户所在部门的数据。

看到自己创建的列表信息无非就是

SELECT
    t1. NAME
FROM
    t_gd t1
WHERE
    t1.creater IN (
        SELECT
            t0.gd_creater
        FROM
            t_permission_data t0
        WHERE
            roleid = '当前登录用户的角色id'
    )

业务部门经理只能看到本部门的所有列表信息无非就是

SELECT
    t1. NAME
FROM
    t_gd t1,
    t_user t2,
    t_user_dept t3
WHERE
    t1.creater = t2.id
AND t2.id = t3.userid
AND t3.deptid in (SELECT
            t0.gd_creater_deptid
        FROM
            t_permission_data t0
        WHERE
            roleid = '当前登录用户的角色id')

这么做的优点是,未来某个角色想看任何一个用户or任何一个部门的信息都是非常轻松的,当然,需要页面支撑一下修改字段值即可。

升级

以上设计看似解决了硬编码问题,但有个常见的问题。PM OR 小老板会告诉你,“xx,用户需求又变了,工单部分还要添加新的数据权限,这个用户比较强势,搞吧”。

遇到这种问题,我们势必还要增加表字段,修改我们的代码,看起来多多少少也有些工作量。怎么办呢?下回见。

(本文章后期优化更新)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
RBAC权限管理及使用原生PHP实现
  关于RBAC的原理讲解在网上可以找到很多,推荐:编程浪子的RBAC讲解(https://my.oschina.net/54php/blog/600249),本篇博客就不再累述RBAC的原理到底是什么样的.   传统的权限控制有ACL和RBAC方式,ACL的耦合度很高,扩展性不佳,RBAC很好的解耦合,将权限控制的整个过程涉及的数据表大致分为5张表
Wesley13 Wesley13
3年前
RBAC模型
RBAC基于角色的访问控制(RoleBasedAccessControl)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用
Stella981 Stella981
3年前
PHP Laravel5实现的RBAC权限管理操作示例
根据不同的权限,在菜单栏显示不同的功能,只对菜单进行了限制,若对路由也进行限制,可以根据菜单的例子,请自行完善,开发。下面请认真学习一下laravel的RBAC设计1、建表(用户表、角色表、权限表、用户角色表、角色权限表)1CREATETABLEIFNOTEXISTSmr_role2(3id
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
C 实现基于角色的权限系统
本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId1068实例使用C实现基于角色的权限菜单管理系统,管理员可以添加用户,删除用户,添加分组,删除分组,添加角色,删除角色,为角色关联权限等功能,管理员用户自定义各个操作员的权限
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这