Yii2的RBAC实现原理详解

yii2框架 反序列化漏洞复现 前言 跟着feng师傅再学习一下yii2的反序列化漏洞,提高代码审计能力 漏洞出现在yii2.0.38之前的版本中,在2.0.38进行了修复,CVE编号是CVE-2020-15148: Yii 2 (yiisoft/yii2) before version 2.0.38 is vulnerable to remote code execution if the application calls unserialize() on arbitrary user input. This is fixed in 阅读详情

一.简介:

RBAC(Role-Based Access Control )基于角色的访问控制。

1.基本思想:在用户和访问权限之间引入角色的概念,将用户和角色联系起来,通过对角色的授权来控制用户对系统资源的访问,相对传统访问控制 引入角色极大地简化了权限的管理。

1).角色:可以理解为一定数量的权限的集合,权限的载体。例如:一个论坛系统,“超级管理员”、“版主”都是角色。

2).权限:版主可管理版内的帖子、可管理版内的用户等,这些是权限。 

2.至于NIST(The National Institute of Standards and Technology,美国国家标准
与技术研究院)标准RBAC模型的4个部件模型(RBAC0-3)都是基于上面的权限模型图为基础进行的,这里不再一一介绍,有兴趣的朋友可以查找资料详细了解。

二.Yii2中对rbac的实现

1.Yii2 实现了通用的分层的 RBAC,遵循的模型也是NIST RBAC model。

2.在yii2中增加了rule规则的概念,rule是什么鬼呢?举个栗子:对于文章系统而言,我们有管理员和普通用户,允许管理员对文章的任何操作,但是只允许普通用户创建文章和修改自己创建的文章,也就是说普通用户是有修改文章的权限的,但是额加的限制条件是只能修改自己的文章,这个额加的验证工作就是rule规则所要负责的事情。

3.yii2的权限管理实现支持文件和db两个载体,基于db实现方式的核心是四个表:

1)存储角色或权限的表:auth_item (type:1表示 角色;2表示权限)

CREATE TABLE `auth_item` (
`name` varchar(64) NOT NULL,
`type` int(11) NOT NULL,
`description` text,
`rule_name` varchar(64) DEFAULT NULL,
`data` text,
`created_at` int(11) DEFAULT NULL,
`updated_at` int(11) DEFAULT NULL,
PRIMARY KEY (`name`),
KEY `rule_name` (`rule_name`),
KEY `type` (`type`),
CONSTRAINT `auth_item_ibfk_1` FOREIGN KEY (`rule_name`) REFERENCES `auth_rule` (`name`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2) 权限和角色的上下级关联表:auth_item_child

(包含关系:角色 可以包含 角色、角色 可以包含 权限、权限 可以包含 权限,但 权限 不可包含 角色)

CREATE TABLE `auth_item_child` (
`parent` varchar(64) NOT NULL,
`child` varchar(64) NOT NULL,
PRIMARY KEY (`parent`,`child`),
KEY `child` (`child`),
CONSTRAINT `auth_item_child_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `auth_item_child_ibfk_2` FOREIGN KEY (`child`) REFERENCES `auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

3)用户与权限(角色)的分配表:auth_assignment

CREATE TABLE `auth_assignment` (
`item_name` varchar(64) NOT NULL,
`user_id` varchar(64) NOT NULL,
`created_at` int(11) DEFAULT NULL,
PRIMARY KEY (`item_name`,`user_id`),
CONSTRAINT `auth_assignment_ibfk_1` FOREIGN KEY (`item_name`) REFERENCES `auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

3).

 

4)规则表:auth_rule

CREATE TABLE `auth_rule` (  
  `name` varchar(64) NOT NULL,  
  `data` text,  //存的是一个序列化的实现了yii\rbac\Rule接口的类的一个对象实例
  `created_at` int(11) DEFAULT NULL,  
  `updated_at` int(11) DEFAULT NULL,  
  PRIMARY KEY (`name`),  
  KEY `name` (`name`),  
  KEY `created_at` (`created_at`),  
  KEY `updated_at` (`updated_at`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限规则表';  

4.使用 RBAC 涉及到两部分工作。第一部分是建立授权数据, 第二部分是使用这些授权数据在需要的地方执行检查。下面将以第二部分为例进入到Yii2的源码看看具体的用户权限的检查流程(也就是假定表中的数据已经就绪):

下面我们以在基础控制器中的beforeAction中验证权限为例:

public function beforeAction($action)
{
    if (!parent::beforeAction($action)) {
        return false;
    }
        
    $controller = Yii::$app->controller->id;
    $action = Yii::$app->controller->action->id;
    $permissionName = $controller.'/'.$action;   //权限名 (比如上门的post/detail)   
    if(!\Yii::$app->user->can($permissionName,['article_id'=>Yii::$app->request->get('id')])){ //检查该用户是否有post/detail这个操作的权限
        throw new \yii\web\UnauthorizedHttpException('对不起,您现在还没获此操作的权限');
    }
    return true;
}

 追踪user组件的can方法:

public function can($permissionName, $params = [], $allowCaching = true)
{
    //缓存中有东东就直接去缓存,使用缓存避免每次都走同样的验证逻辑来提高性能
    if ($allowCaching && empty($params) && isset($this->_access[$permissionName])) {
        return $this->_access[$permissionName];
    }
    //这是关键,以DbManager为例进行跟踪分析
    $access = $this->getAuthManager()->checkAccess($this->getId(), $permissionName, $params);
    if ($allowCaching && empty($params)) {
        $this->_access[$permissionName] = $access;
    }

    return $access;
}

DbManager的checkAcces实现:

/**
 * @inheritdoc
 */
public function checkAccess($userId, $permissionName, $params = [])
{
      //getAssignments该方法所做的工作就是去用户与权限(角色)的分配表:auth_assignment中找出有关该用户的所有权限和角色,具体实现见下:
    $assignments = $this->getAssignments($userId);
    $this->loadFromCache();
    if ($this->items !== null) {
        return $this->checkAccessFromCache($userId, $permissionName, $params, $assignments);
    } else {
        return $this->checkAccessRecursive($userId, $permissionName, $params, $assignments);
    }
}
/**
 * @inheritdoc
 */
public function getAssignments($userId)
{
    if (empty($userId)) {
        return [];
    }

    $query = (new Query)
        ->from($this->assignmentTable)
        ->where(['user_id' => (string) $userId]);

    $assignments = [];
    foreach ($query->all($this->db) as $row) {
        $assignments[$row['item_name']] = new Assignment([
            'userId' => $row['user_id'],
            'roleName' => $row['item_name'],
            'createdAt' => $row['created_at'],
        ]);
    }

    return $assignments;
}

继续checkAccessRecursive方法:

protected function checkAccessRecursive($user, $itemName, $params, $assignments)
{
    //从存储角色或权限的表:auth_item中找出post/detail 这个权限的记录并封装成对象在executeRule方法中使用
    if (($item = $this->getItem($itemName)) === null) {
        return false;
    }

    Yii::trace($item instanceof Role ? "Checking role: $itemName" : "Checking permission: $itemName", __METHOD__);
    //通过$item->ruleName在规则表:auth_rule中找到该权限(post/detail)对应的rule规则,如果有的话就对该用户执行该权限操作的规则验证,如果验证不通过直接返回false
    if (!$this->executeRule($user, $item, $params)) {
        return false;
    }

    //如果在用户与权限(角色)的分配表中匹配到了该权限且规则验证也ok了就说明该用户有权限了呗
    if (isset($assignments[$itemName]) || in_array($itemName, $this->defaultRoles)) {
        return true;
    }

    $query = new Query;
    //如果目前来看该用户没有该操作的权限那么就从权限和角色的上下级关联表中找到该权限的父级,然后递归的检查该用户在该父级里有没有权限,如果父级有权限了那么该权限也有了
    $parents = $query->select(['parent'])
        ->from($this->itemChildTable)
        ->where(['child' => $itemName])
        ->column($this->db);
 
    foreach ($parents as $parent) {
        if ($this->checkAccessRecursive($user, $parent, $params, $assignments)) {
            return true;
        }
    }

    return false;
}
 规则验证方法实现:
 /**
 * @param string|integer $user 用户 ID.
 * @param Item $item 该规则相关的角色或者权限
 * @param array $params 传给 ManagerInterface::checkAccess() 的参数
 * @return boolean 代表该规则相关的角色或者权限是否被允许
 */
protected function executeRule($user, $item, $params)
{
    if ($item->ruleName === null) {
        return true;
    }
    //根据该Item 权限记录对应的rule_name去规则表:auth_rule中找到该条规则记录
    //并对该data字段(前面说过存的是序列化的对象)进行反序列化得到yii\rbac\Rule实现类的对象
    //然后下面执行该对象的execute方法去验证该用户是否有该权限的使用权
    $rule = $this->getRule($item->ruleName);
    if ($rule instanceof Rule) {
        return $rule->execute($user, $item, $params);
    } else {
        throw new InvalidConfigException("Rule not found: {$item->ruleName}");
    }
}

最后以一个具体例子来讲下rule规则的使用:

正如前面所说的那样,规则是给角色和权限增加额外的约束条件。它是 yii\rbac\Rule 的派生类,它需要实现 yii\rbac\Rule::execute() 方法。在上面那个例子中我们验证当前用户有没有post/detail(假设该操作叫查看文章详情),假设我们只让该文章的创建者有权限查看详情,那么验证规则我们可以这样写:
 

namespace ziroom\rbac;
use yii\rbac\Rule;
/**
 * 检查该文章的创建者id是否和该用户的id一样
 */
 class DetailRule extends Rule
 {      
    /**
     * @param string|integer $user 用户 ID.
     * @param Item $item 该规则相关的角色或者权限
     * @param array $params 传给 ManagerInterface::checkAccess() 的参数
     * @return boolean 代表该规则相关的角色或者权限是否被允许
     */
    public function execute($user, $item, $params)
    {      
        //查找该文章的creator_id
        $articleInfo = Article::findOne(['id'=>$params['article_id']]);
        return $articleInfo && $articleInfo->creator_id == $user  ? true : false;
    }
}

 

【Yii2】Yii2使用yii2-admin做RBAC权限管理的安装基本使用 RBAC 基于角色的权限管理 为什么要管理权限 在我们的系统中,存在不同的角色,每个角色对应的操作各不相同。 比如一个角色负责发布文章,他的上级角色负责审核文章,另一个上级则发布文章和审核文章的权限都有。 这时候就需要一个标准化的工作流来处理这些逻辑。 为什么是RBAC 像这种需求,在大部分管理系统都是存在的,经过一段时间的抽象化,大家便总结出了RBAC权限管理. 基本的逻辑... 阅读详情

相关推荐

Yii2框架安装及使用指南

您可以从Yii2官方网站(https://www.yiiframework.com/)下载最新版本的Yii2框架。将下载的压缩包解压到您的Web服务器目录中,例如/var/www/html/yii2。以上就是关于Yii2框架的安装和基本使用的指南。通过按照上述步骤,您可以成功地安装Yii2框架并创建一个简单的应用程序。Yii2是一款功能强大且高效的PHP框架,它提供了丰富的功能和灵活的架构,使得开发Web应用变得更加简单和高效。本文将详细介绍Yii2框架的安装过程,并提供一些示例代码来帮助您入门。

MdlForward的博客 1124

Yii2中的RBAC角色管理机制

本套课程将从基础知识和实战两个方面进行介绍在第一二章你讲学习到yii2的rbac基础知识并自己开发一个简单的rbac系统第三章为你介绍当下yii2稳定的rbac扩展 --- yii2-admin

JSSIP实战:5分钟搞定WebRTC电话功能(附完整代码示例)

本文通过JSSIP库实战演示如何在Web应用中快速集成WebRTC电话功能。文章提供了从环境准备、SIP服务器连接到完整代码示例的详细步骤,涵盖用户注册、拨号接听、媒体流处理等核心环节,并针对常见问题给出排查方案,帮助开发者高效实现网页端实时语音通信。

u8v9w0x1y的博客 517

Yii2全面解析之权限管理RBAC

鉴于RBAC实用性很强,  本文比较长, 但可以保证质量与学习效果.仔细阅读,  跟随练习, 保证对Yii中使用RBAC有根本的理解. 概述 RBAC, 基于角色的访问控制, 对RBAC有问题的朋友, 可以转移到: 基于角色的访问控制RBAC 一文, 进行了解. Yii2中, 实现的是NIST RBAC模型. Yii2中, 的RBAC管理, 涉及到的内容有: 权限, 角色, 规则

mengdc的博客 1万+

Cursor 详细使用

Cursor 是一款基于 VSCode 开发的 AI 驱动代码编辑器,集成 GPT-4、Claude3.5 等先进 LLM,具备代码补全、生成、解释、调试等功能,可提升开发效率和代码质量。3. 代码编辑:在编辑区编写代码,利用快捷键提升效率,如 Ctrl+Space 触发智能代码补全、Ctrl+K 润色或修改代码、Ctrl+L 智能问答与代码编辑。3. 代码解释:选中代码,按 Ctrl+L,输入如 “解释这段代码的功能”,Cursor 会给出详细解释。

坚持写博客,大家的关注是我前进的动力! 4811

ThinkBook 16 2024 Ubuntu驱动全攻略:从无线网卡到触控板

本文详细介绍了ThinkBook 16 2024在Ubuntu系统下的驱动问题解决方案,涵盖无线网卡、蓝牙、显卡和触控板等关键硬件的驱动修复步骤。通过具体命令和配置指南,帮助用户快速解决兼容性问题,提升Ubuntu在ThinkBook上的使用体验。

weixin_29200741的博客 826

yii2的基础版框架yii\rbac一共有哪些方法?使用场景是什么?底层原理是什么?

yii\rbac是 Yii2 框架中的一个权限管理组件,用于实现基于角色的访问控制(Role-Based Access Control,简称 RBAC)。通过yii\rbac,你可以定义角色、权限和规则,从而控制用户对系统的访问。通过以上步骤,你可以使用yii\rbac实现基于角色的访问控制,管理用户的角色和权限。

长风破浪会有时的博客 766

Xlinx PG151 除法器IP 笔记

对Xlinx 除法器IP PG151中部分内容记录备忘。

weixin_50515160的博客 2528

YII2的RBAC是如何实现的?底层原理是什么?

总体而言,YII2的RBAC实现通过使用数据库来存储角色、权限和规则的信息,并通过RBAC管理器提供的方法来管理和查询这些数据。RBAC利用角色和权限的关联关系以及角色的继承关系来实现访问控制。角色继承:YII2的RBAC支持角色的继承关系。当一个角色继承另一个角色时,它将自动获得父角色的权限。RBAC管理器将检查用户所属的角色和分配给角色的权限,以确定用户是否具有所需的访问权限。数据库表结构:YII2的RBAC使用数据库来存储角色、权限和规则的信息。的接口,定义了管理角色、权限和规则的方法。

长风破浪会有时的博客 206

【工具篇】万字长文拆解 Otter.ai:语音转文字领域的「瑞士军刀」是如何炼成的?(附保姆级教程)

但需要注意,2024年欧盟已出台《AI转录伦理指南》,要求所有录音需获得参与者明确授权。举个真实案例:某硅谷创业团队用Otter.ai记录产品评审会,系统自动标红争议点并生成待办事项,会议效率提升40%。AIGC技术原理、 实时转录解析、 定价策略分析、 语音算法拆解、 多平台兼容测试、 深度学习框架、 空间计算专利。——无论是跨国会议、课堂讲座还是深夜灵感,它都能实时生成带时间戳的文本记录,准确率高达95%。(此处建议插入Otter.ai会议转录动图,展示实时字幕生成效果)(数据来源:综合参考文献整理)

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1258

前程无忧Python岗位数据采集:基于API直连的高效招聘信息爬取实战

本文介绍了一个基于Python requests库的前程无忧招聘数据采集系统。项目通过分析API接口结构,配置完整的请求头和身份验证参数,实现了高效稳定的数据采集。系统支持多页数据批量获取,包含工作名称、薪资范围等关键字段的结构化解析,并将结果存储为Excel文件。技术实现涉及API分析、身份验证、请求头配置、数据清洗等关键步骤,同时强调遵守法律和道德规范。该系统可为求职者、HR和市场分析师提供有价值的行业数据支持,适用于市场分析、职业规划等场景。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1549

YII2的RBAC是什么意思?底层原理是什么?

RBAC允许开发人员通过将用户分配给不同的角色和授权它们访问特定资源的权限来管理应用程序的访问控制。每个角色都具有不同的权限集合,而用户通过分配一个或多个角色来获得相应的权限。总结而言,YII2的RBAC是一个基于角色的访问控制系统,通过角色、权限和规则的组合管理应用程序的访问权限。它提供了一套方便的工具和方法来管理和查询角色、权限和规则,以及对用户的访问进行控制。角色(Role):表示用户的角色,它定义了一组权限。角色可以是层次结构的,其中包括父角色和子角色,这样权限可以从父角色传递给子角色。

长风破浪会有时的博客 343

ESP32与DS18B20温度传感器的数据采集与告警系统

并且,通过自定义的微信告警功能,我们可以及时收到温度超过阈值的告警消息。随着物联网的快速发展,传感器在各种应用场景中发挥着重要的作用。本文将介绍如何使用ESP32微控制器与DS18B20温度传感器结合,通过串口输出和Web服务器实现温度数据的采集和监控,并使用自定义微信告警功能。上传完成后,打开串口监视器,您将看到ESP32连接到Wi-Fi网络,并开始监测温度。在您的计算机或移动设备上,打开一个Web浏览器,并输入ESP32的IP地址。在浏览器中输入ESP32的IP地址后,您将看到显示当前温度的页面。

loop_class349的博客 2242

Yii2基于角色的访问控制权限RBAC表结构原理分析

这里有几个概念很重要 权限: 就是指用户是否可以执行哪些操作。 如:小张可以发帖、回帖、浏览,小红只能回帖、浏览 角色: 就是上面说的一组操作的集合。 如:高级会员有发帖、回帖、删贴、浏览的权限,普通会员只有回帖、浏览的权限。 比如小张是高级会员,那么他就可以执行发帖、回帖、删贴、浏览。而小红是普通会员,所以它就只能回帖、浏览。 另外角色还可以继承,中级会员除了普通

wjtlht928的专栏 2713

go语言实现服务器server端与客户client端即时通信(附完整源码)

go语言实现服务器server端与客户client端即时通信(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 626

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Yii2.0中文开发向导——RBAC(基于角色的访问控制权限)表结构原理分析 - yiifans

Yii2.0中文开发向导——RBAC(基于角色的访问控制权限)表结构原理分析 - yiifans这里有几个概念很重要,我简单用大白话说一下;权限:就是指用户是否可以执行哪些操作。如:小张可以发帖、回帖、浏览,小红只能回帖、浏览角色:就是上面说的一组操作的集合。如:高级会员有发帖、回帖、删贴、浏览的权限,普通会员只有回帖、浏览的权限。比如小张是高级会员,那么他就可以执行发帖、回帖、删贴、浏览。而小红...

songtaiwu的博客 285

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

YII2 RBAC模型原理-表结构介绍

YII2 RBAC模型原理-表结构介绍

qq_28511869的博客 735

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Yii2.0中文开发向导——RBAC(基于角色的访问控制权限)表结构原理分析

这里有几个概念很重要,我简单用大白话说一下;权限:就是指用户是否可以执行哪些操作。如:小张可以发帖、回帖、浏览,小红只能回帖、浏览角色:就是上面说的一组操作的集合。如:高级会员有发帖、回帖、删贴、浏览的权限,普通会员只有回帖、浏览的权限。比如小张是高级会员,那么他就可以执行发帖、回帖、删贴、浏...

chuijiaqiong1794的博客 142

PHP小白应该如何使用单点突破法把自带的RBAC功能学到极致?

通过单点突破法,你可以集中精力深入学习 Yii2 的 RBAC 功能。从基本概念理解到具体实现,再到实践项目和进阶学习,逐步掌握 RBAC 的核心原理和使用方法。

长风破浪会有时的博客 585
上一篇: golang之直接插入排序
下一篇: 通过例子理解事务的4种隔离级别
phpduang
博客等级 码龄10年 9粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值