当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

授权(Authorization)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:29:22

) { return $this->render('happy-halloween'); }}基于角色的存取控制 (RBAC)基于角色的存取控制 (RBAC) 提供了一个简单而强大的集中式存取控制机制。 详细的关于 RBAC 和诸多传统的存取控制方案对比的详情,请参阅?Wikipedia。Yii 实现了通用的分层的 RBAC,遵循的模型是?NIST RBAC model. 它通过 yii\rbac\ManagerInterface?application component?提供 RBAC 功能。使用 RBAC 涉及到两部分工作。第一部分是建立授权数据, 而第二部分是使用这些授权数据在需要的地方执行检查。为方便后面的讲述,这里先介绍一些 RBAC 的基本概念。基本概念角色是?权限?的集合 (例如:建贴、改贴)。一个角色 可以指派给一个或者多个用户。要检查某用户是否有一个特定的权限, 系统会检查该包含该权限的角色是否指派给了该用户。可以用一个规则?rule?与一个角色或者权限关联。一个规则用一段代码代表, 规则的执行是在检查一个用户是否满足这个角色或者权限时进行的。例如,"改帖" 的权限 可以使用一个检查该用户是否是帖子的创建者的规则。权限检查中,如果该用户 不是帖子创建者,那么他(她)将被认为不具有 "改帖"的权限。角色和权限都可以按层次组织。特定情况下,一个角色可能由其他角色或权限构成, 而权限又由其他的权限构成。Yii 实现了所谓的?局部顺序?的层次结构,包含更多的特定的?树?的层次。 一个角色可以包含一个权限,反之则不行。(译者注:可理解为角色在上方,权限在下方,从上到下如果碰到权限那么再往下不能出现角色)配置 RBAC在开始定义授权数据和执行存取检查之前,需要先配置应用组件 yii\base\Application::authManager 。 Yii 提供了两套授权管理器: yii\rbac\PhpManager 和 yii\rbac\DbManager。前者使用 PHP 脚本存放授权数据, 而后者使用数据库存放授权数据。 如果你的应用不要求大量的动态角色和权限管理, 你可以考虑使用前者。使用?PhpManager以下代码展示使用 yii\rbac\PhpManager 时如何在应用配置文件中配置?authManager:return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\PhpManager', ], // ... ],];现在可以通过?\Yii::$app->authManager?访问?authManager?。yii\rbac\PhpManager 默认将 RBAC 数据保存在?@app/rbac?目录下的文件中。 如果权限层次数据在运行时会被修改,需确保WEB服务器进程对该目录和其中的文件有写权限。使用?DbManager以下代码展示使用 yii\rbac\DbManager 时如何在应用配置文件中配置?authManager:return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', ], // ... ],];DbManager?使用4个数据库表存放它的数据:yii\rbac\DbManager::$itemTable: 该表存放授权条目(译者注:即角色和权限)。默认表名为 "auth_item" 。yii\rbac\DbManager::$itemChildTable: 该表存放授权条目的层次关系。默认表名为 "auth_item_child"。yii\rbac\DbManager::$assignmentTable: 该表存放授权条目对用户的指派情况。默认表名为 "auth_assignment"。yii\rbac\DbManager::$ruleTable: 该表存放规则。默认表名为 "auth_rule"。继续之前,你需要在数据库中创建这些表。你可以使用存放在?@yii/rbac/migrations?目录中的数据库迁移文件来做这件事(译者注:根据本人经验,最好是将授权数据初始化命令也写到这个 RBAC 数据库迁移文件中):yii migrate --migrationPath=@yii/rbac/migrations现在可以通过?\Yii::$app->authManager?访问?authManager?。建立授权数据所有授权数据相关的任务如下:定义角色和权限;建立角色和权限的关系;定义规则;将规则与角色和权限作关联;指派角色给用户。根据授权的弹性需求,上述任务可用不同的方法完成。如果你的权限层次结构不会发生改变,而且你的用户数是恒定的,你可以通过?authManager?提供的 API 创建一个?控制台命令?一次性初始化授权数据:<?phpnamespace app\commands;use Yii;use yii\console\Controller;class RbacController extends Controller{ public function actionInit() { $auth = Yii::$app->authManager; // 添加 "createPost" 权限 $createPost = $auth->createPermission('createPost'); $createPost->description = 'Create a post'; $auth->add($createPost); // 添加 "updatePost" 权限 $updatePost = $auth->createPermission('updatePost'); $updatePost->description = 'Update post'; $auth->add($updatePost); // 添加 "author" 角色并赋予 "createPost" 权限 $author = $auth->createRole('author'); $auth->add($author); $auth->addChild($author, $createPost); // 添加 "admin" 角色并赋予 "updatePost" // 和 "author" 权限 $admin = $auth->createRole('admin'); $auth->add($admin); $auth->addChild($admin, $updatePost); $auth->addChild($admin, $author); // 为用户指派角色。其中 1 和 2 是由 IdentityInterface::getId() 返回的id (译者注:user表的id) // 通常在你的 User 模型中实现这个函数。 $auth->assign($author, 2); $auth->assign($admin, 1); }}在用?yii rbac/init?执行了这个命令后,我们将得到下图所示的层次结构:作者可创建新贴,管理员可编辑帖子以及所有作者可做的事情。如果你的应用允许用户注册,你需要在注册时给新用户指派一次角色。例如, 在高级项目模板中,要让所有注册用户成为作者,你需要如下例所示修改?frontend\models\SignupForm::signup()?方法:public function signup(){ if ($this->validate()) { $user = new User(); $user->username = $this->username; $user->email = $this->email; $user->setPassword($this->password); $user->generateAuthKey(); $user->save(false); // 要添加以下三行代码: $auth = Yii::$app->authManager;

上一页  [1] [2] [3]  下一页


授权(Authorization)