老莫的笔记本  
  
查看: 1197|回复: 0

TP5.0 权限 与菜单权限

[复制链接]

662

主题

878

帖子

5145

积分

超级版主

Rank: 8Rank: 8

积分
5145
发表于 2018-12-29 09:53:57 | 显示全部楼层 |阅读模式
// ============================权限==============================
问题: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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表