周大胖子 发表于 2018-12-29 09:53:57

TP5.0 权限 与菜单权限

// ============================权限==============================
问题: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表的 nametitle

            菜单删除
            -> 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

页: [1]
查看完整版本: TP5.0 权限 与菜单权限