我们做企业级系统,权限控制主要分三类。
【功能权限】:对菜单栏目进行权限控制,查询,增加,删除,修改功能,一般来说这种对资源的权限控制模型可以做到比较统一(用户、角色、资源)。
【数据权限】:哪些人能看到哪些数据,例如淘宝本人只能看自己订单,北京地区部门领导可以看到电器类部门订单, 最高领导能看到人所有订单等等。 这种跟业务高度相关,(网络上资料暂时比较少)原理主要是对SQL语句添加where 条件
【字段权限】:订单能看到哪些字段,如供应商,看不到内部价、 出厂价等信息。 (网络上资料暂时比较少)实现原理跟数据权限控制是一致的。对SQL语句添加select 条件
这次,我们主要讲解最常用的功能权限控制的实现过程,这类WEB权限控制,在任意后端语言上都可以实现Java、Golang、PHP、Nodejs、Python等等,主要理解其数据模型。
我们先看最终实现的功能效果。
1.角色管理页面
![](https://static.studygolang.com/191014/78eed04be6f6833b6f952e6ae527c02a.png)
这里可以新增角色,删除角色, 注意的是,这里有一个最高权限角色超级管理员,不允许删除,还有一个批量导入管理员默认角色。
2.新增角色,编辑角色
![](https://static.studygolang.com/191014/6cd28e901b8664de6d18d2a3023980fe.png)
这里把系统大部分资源路由进入权限控制,说的大部分是因为有些页面权限是不需要进行控制,例如登陆、注册、以及后台一些下拉选项(读取的数据库接口)。
3.管理员列表
![](https://static.studygolang.com/191014/ac69e3e7b3a17a3216665defb361c1b9.png)
4.给管理员分配权限
![](https://static.studygolang.com/191014/6a1cb3612909b96ea5734dd43335d508.png)
涉及数据表
1.用户表
用户表主要增加字段 rolesId 角色ID,了解这个用户是哪个角色。
2.角色表
角色表主要记录这个角色的名称,描述
CREATE TABLE `t_roles` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名称',
`desc` varchar(50) NOT NULL DEFAULT '' COMMENT '描述',
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
3.路由表
这个表主要添加平台所有需要控制的路由方法,也可以不建表,写到配置文件里面,因为开发完需要控制的权限是固定的。上图:新增编辑角色,显示的就是这个表的内容
CREATE TABLE `t_roles_tree` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '路由名称',
`path` varchar(50) NOT NULL COMMENT '路径',
`methods` varchar(50) NOT NULL COMMENT '方法',
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`parentId` varchar(50) NOT NULL DEFAULT '' COMMENT '级别',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COMMENT='系统所有路由表';
4.权限表
权限表记录了,这个角色有哪些权限。 核心字段为 [角色ID,资源url, 方法]。这里用casbin 实现,因为casbin封装了很多验证函数,节省了一部分工作量。
CREATE TABLE `casbin_rule` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`p_type` varchar(255) NOT NULL DEFAULT '',
`v0` varchar(255) NOT NULL DEFAULT '' COMMENT '角色',
`v1` varchar(255) NOT NULL DEFAULT '' COMMENT 'Url',
`v2` varchar(255) NOT NULL DEFAULT '' COMMENT '方法',
`v3` varchar(255) NOT NULL DEFAULT '',
`v4` varchar(255) NOT NULL DEFAULT '',
`v5` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4;
![](https://static.studygolang.com/191014/2fc1057c3d690920fe3a6c6c15bff259.png)
这一篇最后介绍下 Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。并指出主流后端语言,目前Casbin权限控制支持的语言有Go Java Node.js PHP Python C# Delphi,使用Casbin可以极大提高权限控制开发效率。当然你不用这个库,自己设计表,实现原理是一样。
有疑问加站长微信联系(非本文作者)
![](https://static.golangjob.cn/static/img/footer.png?imageView2/2/w/280)