Yii2 RBAC
2016-07-10 01:09
726 查看
以下是在高级应用模板中的简单实践,用DBManager的方式,Rules和Default Roles略过…
接下来还需要在数据库中创建四张表,跑到项目根目录,使用这个命令:
这样表就创建完了。在数据库里我们就会看到新增的几张表:
auth_item
auth_item_child
auth_assignment
auth_rule
同样将他们加入配置文件:
到此配置就完成了。
上面的代码很直观,无须解释更多。
然后执行下面的命令:
执行完了,不出意外我们的数据表里增加了几条数据:
接下来就是要把权限分配给用户了。比如在用户注册的时候,赋予它相应的角色。
改一下这个frontend\models\SignupForm::signup():
跑到前台注册一下,auth_assignment表会产生这样的数据:
user_id=1,就是刚注册的数据。
在代码里用这个:
我们跑到site/about里实验一下:
刚注册的用户是可以看到这个页面的,如果把createPost改成updatePost就只能看到’Permission Denied’了。
除此之外,还可以这样做:
访问一下,会看到这样:
因为用户只有createPost权限。
如果想要动态添加角色和权限,可以查看类参考手册,yii\rbac\ManagerInterface提供了各种方法。比如下面这些方法:
至此RBAC试验完毕。
配置authManager
在common/config/main.php中加入配置,像这样:return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', ], // ... ], ];
接下来还需要在数据库中创建四张表,跑到项目根目录,使用这个命令:
php yii migrate --migrationPath=@yii/rbac/migrations
这样表就创建完了。在数据库里我们就会看到新增的几张表:
auth_item
auth_item_child
auth_assignment
auth_rule
同样将他们加入配置文件:
return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', 'itemTable' => 'auth_item', 'itemChildTable' => 'auth_item_child', 'assignmentTable' => 'auth_assignment', 'ruleTable' => 'auth_rule', ], // ... ], ];
到此配置就完成了。
创建权限数据
在console/controllers目录下面创建控制器RbacController:<?php namespace console\controllers; use Yii; use yii\console\Controller; class RbacController extends Controller { public function actionInit() { $auth = Yii::$app->authManager; // add "createPost" permission $createPost = $auth->createPermission('createPost'); $createPost->description = 'Create a post'; $auth->add($createPost); // add "updatePost" permission $updatePost = $auth->createPermission('updatePost'); $updatePost->description = 'Update post'; $auth->add($updatePost); // add "author" role and give this role the "createPost" permission $author = $auth->createRole('author'); $auth->add($author); $auth->addChild($author, $createPost); // add "admin" role and give this role the "updatePost" permission // as well as the permissions of the "author" role $admin = $auth->createRole('admin'); $auth->add($admin); $auth->addChild($admin, $updatePost); $auth->addChild($admin, $author); // Assign roles to users. 1 and 2 are IDs returned by IdentityInterface::getId() // usually implemented in your User model. $auth->assign($author, 2); $auth->assign($admin, 1); } }
上面的代码很直观,无须解释更多。
然后执行下面的命令:
php yii rbac/init
执行完了,不出意外我们的数据表里增加了几条数据:
接下来就是要把权限分配给用户了。比如在用户注册的时候,赋予它相应的角色。
改一下这个frontend\models\SignupForm::signup():
public function signup() { if (!$this->validate()) { return null; } $user = new User(); $user->username = $this->username; $user->email = $this->email; $user->setPassword($this->password); $user->generateAuthKey(); $user->save(); // 看这里 $auth = \Yii::$app->authManager; $authorRole = $auth->getRole('author'); $auth->assign($authorRole, $user->getId()); return $user; }
跑到前台注册一下,auth_assignment表会产生这样的数据:
user_id=1,就是刚注册的数据。
权限控制
接下来就简单了。在代码里用这个:
if (\Yii::$app->user->can('createPost')) { // create post }
我们跑到site/about里实验一下:
public function actionAbout() { if (! \Yii::$app->user->can('createPost')) { return 'Permission Denied'; } return $this->render('about'); }
刚注册的用户是可以看到这个页面的,如果把createPost改成updatePost就只能看到’Permission Denied’了。
除此之外,还可以这样做:
// 这个文件: // frontend/controllers/SiteController.php public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), // 这里加个about 'only' => ['logout', 'signup', 'about'], 'rules' => [ [ 'actions' => ['signup'], 'allow' => true, 'roles' => ['?'], ], [ 'actions' => ['logout'], 'allow' => true, 'roles' => ['@'], ], // 看这里 [ 'actions' => ['about'], 'allow' => true, 'roles' => ['updatePost'], ], ], ], 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'logout' => ['post'], ], ], ]; }
访问一下,会看到这样:
因为用户只有createPost权限。
如果想要动态添加角色和权限,可以查看类参考手册,yii\rbac\ManagerInterface提供了各种方法。比如下面这些方法:
\Yii::$app->authManager->getPermissions();//获取所有权限 \Yii::$app->authManager->getRoles();//获取所以角色 //还有各种add,get,remove...
至此RBAC试验完毕。
相关文章推荐
- YII Framework框架教程之安全方案详解
- Yii PHP Framework实用入门教程(详细介绍)
- PHP的Yii框架中Model模型的学习教程
- 详解PHP的Yii框架中自带的前端资源包的使用
- Yii操作数据库的3种方法
- 在yii中新增一个用户验证的方法详解
- 详解PHP的Yii框架中的Controller控制器
- PHP的Yii框架中过滤器相关的使用总结
- Yii框架在页面输出执行sql语句以方便调试的实现方法
- YII动态模型(动态表名)支持分析
- 浅析Yii中使用RBAC的完全指南(用户角色权限控制)
- 详解在PHP的Yii框架中使用行为Behaviors的方法
- Yii 连接、修改 MySQL 数据库及phpunit 测试连接
- 深入讲解PHP的Yii框架中的属性(Property)
- yii实现使用CUploadedFile上传文件的方法
- 实例讲解如何在PHP的Yii框架中进行错误和异常处理
- 解读PHP的Yii框架中请求与响应的处理流程
- 详解PHP的Yii框架中组件行为的属性注入和方法注入
- YII Framework学习之request与response用法(基于CHttpRequest响应)
- Yii 2 —— session