rbac权限控制,基于无线分类

2018年9月18日11:21:28

数据库结构

CREATE TABLE `admin` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `create_time` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘创建时间‘,
  `update_time` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘更新时间‘,
  `remark` varchar(200) DEFAULT NULL COMMENT ‘备注‘,
  `is_delete` tinyint(1) NOT NULL DEFAULT ‘10‘ COMMENT ‘10默认99删除‘,
  `shop_id` bigint(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘店铺ID‘,
  `admin_login_name` varchar(20) NOT NULL COMMENT ‘登录名称‘,
  `admin_password` varchar(32) DEFAULT NULL COMMENT ‘登录密码‘,
  `admin_phone` varchar(11) DEFAULT NULL COMMENT ‘手机号码‘,
  `admin_email` varchar(20) DEFAULT NULL COMMENT ‘邮箱‘,
  `real_name` varchar(20) DEFAULT NULL COMMENT ‘真实姓名‘,
  `admin_avatar` varchar(100) DEFAULT NULL COMMENT ‘管理员头像‘,
  `admin_qq` varchar(20) DEFAULT NULL COMMENT ‘管理员qq‘,
  `admin_id` bigint(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘创建者管理员ID‘,
  `manage_product` varchar(200) DEFAULT NULL COMMENT ‘管理的商品属性分类‘,
  `admin_status` tinyint(1) unsigned NOT NULL DEFAULT ‘10‘ COMMENT ‘默认10通过20不通过99‘,
  `session_id` varchar(50) DEFAULT NULL COMMENT ‘session_id‘,
  `admin_group_ids` varchar(500) DEFAULT NULL COMMENT ‘用户权限组ID集合‘,
  `is_admin` tinyint(1) unsigned NOT NULL DEFAULT ‘10‘ COMMENT ‘系统超级管理员10默认20是‘,
  `is_shop_admin` tinyint(1) unsigned NOT NULL DEFAULT ‘10‘ COMMENT ‘店铺管理员10默认20是‘,
  `token` varchar(32) DEFAULT NULL COMMENT ‘token字符串‘,
  `token_time` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘token创建时间‘,
  `status` tinyint(1) NOT NULL DEFAULT ‘10‘ COMMENT ‘默认10锁定20‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT=‘管理员表‘

admin_group

CREATE TABLE `admin_group` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `create_time` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘创建时间‘,
  `update_time` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘更新时间‘,
  `remark` varchar(200) DEFAULT NULL COMMENT ‘备注‘,
  `is_delete` tinyint(1) NOT NULL DEFAULT ‘10‘ COMMENT ‘10默认99删除‘,
  `parent_group_id` int(10) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘父ID 0是顶级‘,
  `group_name` varchar(50) NOT NULL COMMENT ‘分组名称‘,
  `permission_ids` text COMMENT ‘permission_id集合‘,
  `tag` varchar(50) DEFAULT NULL COMMENT ‘标签‘,
  `sort` tinyint(1) unsigned NOT NULL DEFAULT ‘255‘ COMMENT ‘排序‘,
  `shop_id` bigint(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘店铺ID‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT=‘admin权限组‘
admin_permission
CREATE TABLE `admin_permission` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `create_time` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘创建时间‘,
  `update_time` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘更新时间‘,
  `remark` varchar(200) DEFAULT NULL COMMENT ‘备注‘,
  `is_delete` tinyint(1) NOT NULL DEFAULT ‘10‘ COMMENT ‘10默认99删除‘,
  `parent_permission_id` int(10) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘父ID 0是顶级‘,
  `permission_name` varchar(50) NOT NULL COMMENT ‘控制名称‘,
  `permission_url` varchar(100) NOT NULL DEFAULT ‘‘ COMMENT ‘控制器URL‘,
  `tag` varchar(50) NOT NULL DEFAULT ‘‘ COMMENT ‘标签,标志‘,
  `is_menu` tinyint(1) unsigned NOT NULL DEFAULT ‘1‘ COMMENT ‘作为菜单显示,1是,2不是‘,
  `small_icon_name` varchar(50) DEFAULT NULL COMMENT ‘小图标名称‘,
  `shop_id` bigint(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘店铺ID‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COMMENT=‘管理员权限表‘

一些逻辑代码

//获取菜单数据
    public static function get_menu($admin_id = null, $is_shop_admin = 10, $is_admin = 10) {
        if (empty($admin_id)) {
            throw new \Exception(‘管理员ID为空‘);
        }
        $field = array(‘id‘, ‘parent_permission_id‘, ‘permission_name‘, ‘permission_url‘, ‘small_icon_name‘);
        $result = AdminPermission::where(‘is_menu‘, 1)->orderBy(‘id‘, ‘asc‘)->get($field)->toArray();
        if (empty($result)) {
            throw new \Exception(‘权限表为空‘);
        }
        //获取菜单树数组
        $menu = self::tree_menu($result);
        //店铺管理员或者超级管理员都有全部权限
        if ($is_shop_admin == 20 || $is_admin == 20) {
            return $menu;
        } else {
            return self::filter_menu($menu, $admin_id);
        }
    }

    //过滤菜单,只做到3层过滤,超过4层不支持,第三层作为具体菜单层
    public static function filter_menu($menu = null, $admin_id = null) {

        $permission = self::get_current_admin_permission($admin_id);
        if (empty($permission)) {
            //如果在 admin_group  admin_permission  admin 三表关系有问题查询会有问题,就会返回false,就直接返回空,没有菜单
            throw new \Exception(‘未获得当前用户权限菜单‘);
        }

        //先测试使用,可能存在bug
        foreach ($menu as $k => &$v) {
            foreach ($v[‘child‘] as $kk => &$vv) {
                foreach ($vv[‘child‘] as $kkk => &$vvv) {
                    if (!in_array($vvv[‘id‘], $permission)) {
                        unset($menu[$k][‘child‘][$kk][‘child‘][$kkk]);
                    }
                }
                if (empty($vv[‘child‘])) {
                    unset($menu[$k][‘child‘][$kk]);
                }
            }
            if (empty($v[‘child‘])) {
                unset($menu[$k]);
            }
        }
        return $menu;
    }

    //获取当前用户的权限ID集合数组
    public static function get_current_admin_permission($admin_id = null) {
        $result = Admin::where(‘id‘, $admin_id)->first([‘admin_group_ids‘]);
        $result_new = $result->toArray();
        if (empty($result_new[‘admin_group_ids‘])) {
            throw new \Exception(‘该用户未设置权限‘);
        }
        $admin_group_ids = explode(‘,‘, $result_new[‘admin_group_ids‘]);

        $results = AdminGroup::whereIn(‘id‘, $admin_group_ids)->get([‘permission_ids‘])->toArray();
        if (empty($results)) {
            throw new \Exception(‘系统权限组设置有问题‘);
        }
        //合并 permission_ids 在做查询,减少查询,提高性能
        $permission_ids = [];
        foreach ($results as $k => &$v) {
            //空,unset防止出错
            if (empty($v[‘permission_ids‘])) {
                unset($v);
            } else {
                $v = explode(‘,‘, trim($v[‘permission_ids‘], ‘,‘));
                foreach ($v as $kk => $vv) {
                    $permission_ids[] = $vv;
                }
            }
        }
        $permission_ids_array = array_unique($permission_ids);

        //防止数据出错
        $result_2 = AdminPermission::wherein(‘id‘, $permission_ids_array)->get([‘id‘])->toArray();
        if (empty($result_2)) {
            throw new \Exception(‘未获得权限数据‘);
        }
        $return_array = array();
        foreach ($result_2 as $key => $value) {
            $return_array[] = $value[‘id‘];
        }
        return $return_array;
    }

    //递归数据
    public static function tree_menu($menu = null, $parent = 0) {
        $tree = array();
        foreach ($menu as $v) {
            if ($v[‘parent_permission_id‘] == $parent) {
                $v[‘child‘] = self::tree_menu($menu, $v[‘id‘]);
                if (empty($v[‘child‘])) {
                    unset($v[‘child‘]);
                }
                $tree[] = $v;
            }
        }
        return $tree;
    }

显示配合的是 bootstrap-treeview 做的无线递归树

https://www.cnblogs.com/zx-admin/p/8021734.html 实际效果这可以看到

原文地址:https://www.cnblogs.com/zx-admin/p/9667890.html

时间: 2024-10-11 16:10:17

rbac权限控制,基于无线分类的相关文章

基于thinkphp的RBAC权限控制

RBAC  Role-Based Access Control 权限控制在后台管理中是十分常见的,它的模型大体上是下面这张图的形式 我用的字段和上面不一样,图只是个示例 一个简易的权限控制模型只需要3个表就行了 user表:记录用户的信息和用户的角色 ->user_id:用户的id ->user_role_id:用户的角色信息  0,1,2分别为超级管理员,经理,员工 ->其它省略... role表:记录不同的角色信息,和他们拥有的权限 ->role_id:角色的id    1为经

转:RBAC权限控制

名词解释: RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring Security, 一. RBAC 要解决的常见问题 问题一:对某一个用户只授予一些特殊的权限 描述:既不希望扩大某一个角色的权限,也不希望因此创建出很多零碎的.只为一个用户而存在的角色. 问题二:性能问题 描述:B/S 下,菜单.页面.页面元素.dataset的列,这些层层权限判断过于复杂,容易造成系统访问非常缓慢. 问题三:如何减少 HardC

RBAC权限控制

名词解释: RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring Security, 一. RBAC 要解决的常见问题 问题一: 对某一个用户只授予一些特殊的权限 描述:既不希望扩大某一个角色的权限,也不希望因此创建出很多零碎的.只为一个用户而存在的角色. 问题二: 性能问题 描述:B/S 下,菜单.页面.页面元素.dataset的列,这些层层权限判断过于复杂,容易造成系统访问非常缓慢. 问题三: 如何减少 Ha

yii2搭建完美后台并实现rbac权限控制案例教程

作者:白狼 出处:www.manks.top/article/yii2_frame_rbac_template 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/config/main-local.php 实际项目中本地的数据库往往跟线上数据库不一致, 我们这里配置到mai

rbac 权限控制

RBAC 的控制,大致是通过将角色的权限控制,来控制用户的权限. 需要构建的表为 用户表(user) ,角色表(role),节点表(node),三张主表 , 节点表内记录的是所有的权限和方法. 2张关联表,是为了关联3张数据表的,分别未 角色用户表(user_role),角色权限表(role_node),也可将两张表写成字段分别加入到用户表和权限表内; 废话不多说看下,键表语句如下 用户表: CREATE TABLE `wj_admin` ( `id` int(11) NOT NULL AUTO

ThinkPHP中:RBAC权限控制的实习步骤

使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据库,库下建立五张表 建表好导入数据的代码如下 1 # -------------------------------------------------------- 2 # Host: 127.0.0.1 3 # Server version: 5.0.45-community-nt-log 4

AngularJS中在前后端分离模式下实现权限控制 - 基于RBAC

权限的设计中比较常见的就是RBAC基于角色的访问控制,基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合.每一种角色对应一组相应的权限. 一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限.这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销. 在Angular构建的单页面应用中,要实现这样的架构我们需要额外多做一些事

AngularJS中实现权限控制 - 基于RBAC

权限的设计中比较常见的就是RBAC基于角色的访问控制,基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合.每一种角色对应一组相应的权限. 一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限.这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销. 在Angular构建的单页面应用中,要实现这样的架构我们需要额外多做一些事

使用Spring Security、Spring Data Jpa实现的RBAC权限控制

正好这几天不是那么忙,所以就研究了一下Spring Security的使用,为了以后方便写篇帖子记录一下. 1.什么是Spring Security? 我想关于什么是Spring Security我都不需要在这里赘述,大家可以到网上百度一下,但是问了大家能快速的融入还是贴一下 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转I