Yii各版本RBAC配置差异显著:Yii1.1用CPhpAuthManager/CDbAuthManager,需手动建表或初始化auth.php;Yii2内置DbManager,通过迁移生成四张表并用$auth操作;Yii3移除内置RBAC,改用yiisoft/authorization包实现策略式授权。

Yii1.1 的 RBAC 配置
Yii1.1 使用 CPhpAuthManager 或 CDbAuthManager,权限数据默认以 PHP 文件形式存储,适合小项目或静态权限体系。
- 在
protected/config/main.php的components中添加:
‘authManager’ => array(
‘class’ => ‘CPhpAuthManager’,
‘itemFile’ => ‘protected/data/auth.php’
),
- 首次运行需手动初始化权限结构:创建
protected/data/auth.php文件,写入空数组array();或使用命令行执行php protected/yiic.php rbac(需自定义 RbacCommand)。 - 权限检查用
Yii::app()->user->checkAccess('createPost'),无需数据库表。 - 若改用数据库存储,替换 class 为
CDbAuthManager,并手动建表(AuthItem、AuthItemChild、AuthAssignment、AuthRule),表结构可参考 Yii1 源码中framework/web/auth/下的 SQL 脚本。
Yii2 的 RBAC 配置
Yii2 原生支持 DbManager 和 PhpManager,推荐生产环境用 DbManager,依赖四张标准表。
- 在
config/web.php和config/console.php的components中统一配置:
'authManager' => [
'class' => 'yii\rbac\DbManager',
// 可选:指定表名
'itemTable' => 'auth_item',
'assignmentTable' => 'auth_assignment',
'itemChildTable' => 'auth_item_child',
'ruleTable' => 'auth_rule'
],
- 执行迁移生成表:
yii migrate --migrationPath=@yii/rbac/migrations - 初始化权限数据建议用控制台命令(如
RbacController::actionInit()),代码中调用$auth->createRole()、$auth->createPermission()、$auth->addChild()、$auth->assign() - 控制器中权限校验直接用
$this->can('updatePost')或行为过滤器AccessControl+'roles' => ['@', 'admin']
Yii3 的 RBAC 配置
Yii3 已移除内置 RBAC 组件,官方明确表示「RBAC 不再是框架核心功能」,转为社区驱动扩展。当前主流方案是使用 yiisoft/authorization 包,它提供更现代、可组合的授权模型(Policy-based,非传统 RBAC)。
- 安装扩展:
composer require yiisoft/authorization - 配置服务容器(如
config/services.php):
return [
AuthorizationInterface::class => [Authority::class],
RuleEvaluatorInterface::class => [RuleEvaluator::class],
];
- 定义策略(Policy)替代“角色”和“权限”,例如:
new PostUpdatePolicy(),内部可基于用户属性、上下文或规则动态判断。 - 校验方式变为:
$authorizer->isGranted($user, new PostUpdatePolicy($post)) - 没有
auth_item等固定表结构;权限逻辑由 PHP 类封装,更灵活但也要求开发者自行设计存储与分配机制(如结合 Doctrine 或自定义仓储)。


















