问题引出
最近,许多学员反馈项目中需要处理数据权限,但是不知道怎么处理比较合适。这篇手记将针对这个问题,给出一种比较通用且容易扩展的数据权限设计方案。
现状
目前流行的权限框架已经有支持数据权限的了,但是需要配置在接口和方法上,扩展性不是很好,那么怎样做能让扩展性最大化呢?
很容易想到的就是:将数据权限的控制放到数据库里存储,在权限拦截时先判断接口是否有权访问,在接口有权访问后,接下来根据配置的条件判断是否有权使用指定的参数值。(做的更高级些,可以对返回的结果进行检查,包含了某个值的某个对象不允许访问的话,也当做无权访问处理,这篇手记里暂时不考虑这个情况)。具体怎么做呢?
数据库设计
先从数据库表设计说起,首先定义一个数据权限控制表结构:
CREATE TABLE `sys_acl_data` (
`id` int(11) NOT NULL,
`acl_id` int(11) NOT NULL COMMENT '对应权限表主键',
`status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态,1:可用,0:不可用',
`param` varchar(20) NOT NULL DEFAULT '' COMMENT '参数',
`operation` int(11) NOT NULL DEFAULT 0 COMMENT '操作类型,0;等于,1:大于,2:小于,3:大于等于,4:小于等于,5:包含,6:介于之间,。。。',
`value1` varchar(100) NOT NULL DEFAULT '0',
`value2` varchar(100) NOT NULL DEFAULT '0',
`next_param_op` int(11) NOT NULL DEFAULT 0 COMMENT '后续有参数时连接的关系,0:没有其他参数控制,1:与&&,2:或||',
`seq` tinyint(4) NOT NULL DEFAULT '0' COMMENT '顺序',
PRIMARY KEY (`id`),
INDEX `idx_acl_id` USING BTREE (`acl_id