|
// ============================权限==============================
问题:1 什么是auth ?
是一种权限验证体系
问题:2 auth 能达到怎样的效果?
验证各人的权限,在做对应的一些操作时,会主动验证该用户是否有这个权限;
还有菜单的生成,菜单在传递之前过滤一遍;
问题:3 实现原理是什么?
3.1 先去添加权限(权限就是节点,paseinfo);
3.2 再去添加角色 (所有权限都与这个角色表相连,其实就是个中转 );
3.3 再去添加管理员 (管理员 对应 管理员详情 对应 角色 再对应 权限)
3.4 设置一个角色: 普通民众 ;角色权限字段就是 空
3.5 每个用户可以有多种角色:
3.6 做一个基类 每次,在继承的时候 搞一个构造函数去调用他 这个构造函数 有以下几个功能:
3.6.1 判断登陆状态
3.6.2 判断是否有权限
3.6.3 缩写路径时应当如何设置
答:数据库中存的就是短的
$action = request()->action(); //方法名
理论上是将这个放进去,但其实不是。报错了?数据库中没有就说我没权限?
// 好像,原则上,这样是没毛病的
我现在准备先去循环 拿出权限表中的所有权限,缓存起来 ,访问的时候 判断这个值在权限表中存不存在,存在 就去判断有没有权限, 不存在就pass
3.6.4 不区分大小写
问题:4 实现步骤:
选用5ini99/think-auth
4.1 安装 :composer require 5ini99/think-auth
4.2 按照所需去建三张表 外加第四张表 管理员列表
4.3 在config 中修改默认配置:
// auth配置
'auth' => [
'auth_on' => 1, // 权限开关
'auth_type' => 1, // 认证方式,1为实时认证;2为登录认证。
'auth_group' => 'auth_group', // 用户组数据不带前缀表名
'auth_group_access' => 'auth_group_access', // 用户-用户组关系不带前缀表名
'auth_rule' => 'auth_rule', // 权限规则不带前缀表名
'auth_user' => 'admins', // 用户信息不带前缀表名
],
4.4 左侧菜单添加 三个子菜单:
管理员管理 ->角色管理
管理员管理 ->权限管理
管理员管理 ->管理员列表
问题:5 菜单权限怎么做?(前面做的是操作权限:权限一共分两块:菜单权限、操作权限)
5.1 上级权限?
菜单权限:子权限
例如:
合同口
审批合同口
1.审批口
管理合同口
1.删除口、2.修改口、3.禁用口
系统设置口
菜单管理口
1.添加菜单口、2.查看菜单口、3.修改菜单口、4.删除菜单口
权限管理口
1.添加权限口、2.查看权限口、3.修改权限口、4.删除权限口
5.2 数据结构?
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, //主键
`name` char(80) NOT NULL DEFAULT '', //节点
`title` char(20) NOT NULL DEFAULT '', //名称
`type` tinyint(1) NOT NULL DEFAULT '1',
`status` tinyint(1) NOT NULL DEFAULT '1',
`condition` char(100) NOT NULL DEFAULT '', # 规则附件条件,满足附加条件的规则,才认为是有效的规则
'gid' mediumint(8) // 父节点
'menu' int(8) //菜单的id 值
// 无限循环 取得所有选项 ,然后按照上方数据格式展示;
重要点:每添加一个菜单,都要产生一个对应的权限,
每删除一个菜单,都要删除对应的权限【两个都是status 改动】
注意,包括主权限在内,每个菜单都有唯一的识别值,
(权限是通过name 验证,name不存在 则不验证,存在没权限则不通过)
过程详解:
添加一个菜单
-> 获取刚刚添加的id 存入 b的 menu 字段 ,
添加的菜单名【干脆就叫菜单吧】 存入b的title 字段;【这个值也没啥意义了,连表查询时候 也就干掉了】
添加的菜单链接 存入b的name 字段;【这个值就没啥意义了;跳转页面时,也不会发送请求】
-> 渲染菜单之前,先访问 b表,读出该用户对应角色可以用的所有菜单
【该用户所对应的角色具有 rule 字段, 循环这个字段拿到匹配的 id 再把里面带 menu 字段的值拿出来】
-> 根据对应的id 值 拿到可选菜单,生成无限下拉菜单JSON返回给前台
添加一个权限
-> 直接添加,在添加时,加入select选项: 选b表中 所有带 menu 字段的 rule
-> 则把 select 选中的选项所带有的id 存入 b表的gid 字段
[如果单独添加一个权限,不分属于任何一个菜单,则,谁管你啊,爱咋咋滴]
角色添加时 的 权限选择窗口【展示所有权限】
-> 直接生成 大JSON 样式参考上述案例
-> 提交时,循环,获取所有被选中的input 的 id 存入 角色权限列表
菜单编辑:
-> 名称、链接 => b表的 name title
菜单删除
-> status 0 => b表的 status 0
权限的编辑
-> name 、title => 菜单表的 ,名称和链接
权限的删除
-> status 0 => 菜单表的 status 0
第二种构思:[本构思的前提,一个人只能是一个角色]
给b[规则]表增加 gid 字段; 【这个gid 是菜单的id】
// 给a[菜单]
给c[角色组表]增加 menus 字段; 内存菜单对应的id
添加一个权限
-> 选择所属父级【就是这个菜单】
-> 提交权限,将菜单id 存到 gid 上
添加一个菜单 无影响
添加一个角色
-> 查菜单表,查权限表,将所有的权限 归属到对应的菜单
-> 选择要显示的菜单, 选择要显示的权限
-> 保存提交, 提交时区分 哪个是菜单的选项menuIdArr , 哪个是权限的属性 ruleIdArr
-> menuIdArr存入c 表的 menus 字段,以英文 ,隔开 ,ruleIdArr 仍然存至 rules 字段
菜单生成;
-> 从缓存中,读取用户的id
-> 连表查询 查uid=id =>group_id =>menus
-> 循环menus 字段 ,然后 取出所有的菜单,再拼成无限极下拉菜单
权限判断 【维持原装 无影响】
编辑菜单 【无影响】
权限删除 【无影响】
删除菜单 【无影响】
角色删除 【无影响】
角色编辑 【无影响】
参考文献:https://packagist.org/packages/5ini99/think-auth
参考文献:https://www.cnblogs.com/guoyinglichong/p/8214710.html
参考文献:http://www.thinkphp.cn/topic/28596.html
|
|