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

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,用户需求又变了,工单部分还要添加新的数据权限,这个用户比较强势,搞吧”。

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

(本文章后期优化更新)

转载于:https://my.oschina.net/xiaozhutefannao/blog/1602299

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值