RBAC权限认证概述
权限概述
权限也就是用户是否能够访问后台某个页面。权限即控制器中的某一个方法。对于是否有权访问访问某个方法的操作经常使用的就是RBAC方式实现
RBAC方式控制权限
RBAC基于角色的权限控制系统。一个用户属于某一种角色。而角色对应拥有哪些权限信息。因此用户就拥有了角色所对应的权限信息
关于权限说明:权限信息即后台中所对应的控制器及方法。此信息需要保存到数据表中。当检查用户是否具备权限时,通过使用当前用户访问的控制器跟方法名称与已经拥有的权限进行对比即可。在赋予权限过程中。如果直接给用户赋予权限操作麻烦。可以使用角色赋予权限。用户归属角色。用户自动的就拥有了权限

1.3、RBAC具体要实现的功能
1、用户的管理功能(后台用户的增删改查)
2、角色的管理功能(增删改查)
3、权限信息的增删改查操作
4、给用户分配角色
5、给角色分配权限信息
6、针对后台中每一个方法进行判断是否拥有权限(根据当前用户访问的控制器方法跟当前用户归属的角色对应的权限信息进行比较)
7、根据权限信息生成后台首页的导航菜单
8、预留一个超级管理员用户
9、预留一个超级管理员角色
2、创建数据表
2.1、创建角色表
CREATE TABLE `shop_role` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`role_name` varchar(255) NOT NULL DEFAULT ” COMMENT ‘角色名称’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.2、创建用户角色中间表
CREATE TABLE `shop_admin_role` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`admin_id` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘后台用户id 关联admin表中的id字段’,
`role_id` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘角色ID 关联角色表中的ID字段’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’用户角色中间表’;
2.3、创建权限表
CREATE TABLE `shop_rule` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`rule_name` varchar(255) NOT NULL DEFAULT ” COMMENT ‘权限名称’,
`module_name` varchar(255) NOT NULL DEFAULT ‘admin’ COMMENT ‘模块名称’,
`controller_name` varchar(255) NOT NULL DEFAULT ” COMMENT ‘控制器名称’,
`action_name` varchar(255) NOT NULL DEFAULT ” COMMENT ‘操作名称’,
`parent_id` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘上级权限id’,
`is_show` tinyint(4) NOT NULL DEFAULT ‘1’ COMMENT ‘是否导航菜单显示 1显示 0不显示’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’权限表’;
2.4、创建角色权限中间表
CREATE TABLE `shop_role_rule` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`role_id` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘角色ID’,
`rule_id` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘权限ID’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’角色权限中间表’;

3、角色管理功能
3.1、实现角色的添加
①创建控制器增加生成模型的方法

②创建方法处理角色添加

③创建自定义模型

④处理模板

效果如下


3.2、列表显示
①创建方法

②实现listData方法

③处理模板

效果如下

3.3、角色删除
①修改角色列表中参数名称

②创建方法实现删除

③修改模型增加dels方法

④再次修改控制器方法对超级管理进行过滤

3.4、编辑功能
①创建方法实现显示模板及数据提交

②创建模板

效果

用户管理功能
4.1、用户添加
4.1.1、实现添加的表单
①创建控制器方法显示模板

②创建模板

效果

4.1.2、实现数据的添加入库
①修改add方法处理表单提交

②创建模型下insert方法


结果如下


4.2、实现用户的列表显示
①创建方法获取数据

②实现模型下的listData方法

③处理模板

效果

4.3、实现用户的删除功能
①创建方法

②实现dels方法

④限制预留的超级管理不能删除

4.4、用户编辑功能
4.4.1、显示原始信息
①创建方法获取用户的信息

②模型下实现方法

调用此方法获取到的数据如下

③处理模板显示

最终效果如下

4.4.2、实现用户信息修改入库
①修改方法代码

②实现update方法进修改


具体效果数据变化即可

权限管理
5.1、权限添加
5.1.1、显示添加模板
①复制分类的控制器修改

②复制分类的模型并且修改

③复制视图

④修改添加控制器显示模板

⑤修改模型

⑥修改视图模板

5.1.2、实现添加数据提交
①修改添加处理表单提交

效果如下


5.2、权限列表显示
①修改index方法

②修改模板

5.3、权限删除功能
①修改dels方法

②修改模型下的dels方法

5.4、权限的编辑
①修改edit方法显示原始信息

②修改模板

效果如下

③修改edit方法处理表单提交

④修改模型下的update方法

⑤修改getTree方法

为角色赋予权限
6.1、显示权限信息
①修改角色列表增加权限分配的入口


②创建方法获取所有的权限信息

③拷贝模板

④修改模板显示数据



效果如下

6.2、实现权限信息的入库
①修改控制器方法处理表单提交

②创建模型方法

最终效果

6.3、实现显示权限时勾选状态
当进行分配权限时,显示所有权限信息,如果当前角色已经拥有此权限应该处于勾选状态
①修改分配权限显示

②增加模型方法

得到的结果

③再次修改模板对数据进行格式化


④修改模板


分析权限认证的实现
- 当用户登录完成之后可以获取到用户信息
- 根据用户ID获取对应的角色ID
- 当角色ID为1表示为超级管理员角色 设置不进行任何权限认证,也需要获取所有的权限信息(由于导航菜单的显示)。当角色ID为其他时。先根据角色ID到角色权限中间表中找到角色对应的权限ID,在根据权限ID获取到详细权限信息
- 根据当前用户请求的模块名、控制器名、方法名称与第3步获取到的权限结果集进行比较。为了比较方便 在第3步对获取到的权限信息格式化成为一个一维数组。然后在进行判断 是否在数组即可
- 实现显示导航菜单。根据已有的权限信息将is_show为1的放入到一个数组中。模板中显示即可
