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

授权(Authorization)

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

$authorRole = $auth->getRole('author'); $auth->assign($authorRole, $user->getId()); return $user; } return null;}对于有动态更改授权数据的复杂存取控制需求的,你可能需要使用?authManager?提供的 API 的开发用户界面(例如:管理面板)。使用规则 (Rules)如前所述,规则给角色和权限增加额外的约束条件。规则是 yii\rbac\Rule 的派生类。 它需要实现 yii\rbac\Rule::execute() 方法。在之前我们创建的层次结构中,作者不能编辑自己的帖子,我们来修正这个问题。 首先我们需要一个规则来认证当前用户是帖子的作者:namespace app\rbac;use yii\rbac\Rule;/** * 检查 authorID 是否和通过参数传进来的 user 参数相符 */class AuthorRule extends Rule{ public $name = 'isAuthor'; /** * @param string|integer $user 用户 ID. * @param Item $item 该规则相关的角色或者权限 * @param array $params 传给 ManagerInterface::checkAccess() 的参数 * @return boolean 代表该规则相关的角色或者权限是否被允许 */ public function execute($user, $item, $params) { return isset($params['post']) ? $params['post']->createdBy == $user : false; }}上述规则检查?post?是否是?$user?创建的。我们还要在之前的命令中 创建一个特别的权限?updateOwnPost?:$auth = Yii::$app->authManager;// 添加规则$rule = new \app\rbac\AuthorRule;$auth->add($rule);// 添加 "updateOwnPost" 权限并与规则关联$updateOwnPost = $auth->createPermission('updateOwnPost');$updateOwnPost->description = 'Update own post';$updateOwnPost->ruleName = $rule->name;$auth->add($updateOwnPost);// "updateOwnPost" 权限将由 "updatePost" 权限使用$auth->addChild($updateOwnPost, $updatePost);// 允许 "author" 更新自己的帖子$auth->addChild($author, $updateOwnPost);现在我们得到如下层次结构:存取检查授权数据准备好后,存取检查简单到只需要一个方法调用 yii\rbac\ManagerInterface::checkAccess()。 因为大多数存取检查都是针对当前用户而言,为方便起见, Yii 提供了一个快捷方法 yii\web\User::can(),可以如下例所示来使用:if (\Yii::$app->user->can('createPost')) { // 建贴}如果当前用户是?ID=1?的 Jane ,我们从图中的?createPost?开始,并试图到达?Jane?。 (译者注:参照图中红色路线所示的建贴授权流程)为了检查某用户是否能更新帖子,我们需要传递一个额外的参数,该参数是?AuthorRule?要用的:if (\Yii::$app->user->can('updatePost', ['post' => $post])) { // 更新帖子}下图所示为当前用户是 John 时所发生的事情:我们从图中的?updatePost?开始,经过?updateOwnPost。为通过检查,Authorrule?规则的?execute()?方法应当返回?true?。该方法从?can()?方法调用接收到?$params?参数, 因此它的值是?['post' => $post]?。如果一切顺利,我们会达到指派给 John 的author?角色。对于 Jane 来说则更简单,因为她是管理员:使用默认角色所谓默认角色就是?隐式?地指派给?所有?用户的角色。不需要调用 yii\rbac\ManagerInterface::assign() 方法做显示指派,并且授权数据中不包含指派信息。默认角色通常与一个规则关联,用以检查该角色是否符合被检查的用户。默认角色常常用于已经确立了一些角色的指派关系的应用(译者注:指派关系指的是应用业务逻辑层面, 并非指授权数据的结构)。比如,一个应用的 user 表中有一个?group?字段,代表用户属于哪个特权组。 如果每个特权组可以映射到 RBAC 的角色,你就可以采用默认角色自动地为每个用户指派一个 RBAC 角色。 让我们用一个例子展示如何做到这一点。假设在 user 表中,你有一个?group?字段,用 1 代表管理员组,用 2 表示作者组。 你规划两个 RBAC 角色?admin?和?author?分别对应这两个组的权限。 你可以这样设置 RBAC 数据,namespace app\rbac;use Yii;use yii\rbac\Rule;/** * 检查是否匹配用户的组 */class UserGroupRule extends Rule{ public $name = 'userGroup'; public function execute($user, $item, $params) { if (!Yii::$app->user->isGuest) { $group = Yii::$app->user->identity->group; if ($item->name === 'admin') { return $group == 1; } elseif ($item->name === 'author') { return $group == 1 || $group == 2; } } return false; }}$auth = Yii::$app->authManager;$rule = new \app\rbac\UserGroupRule;$auth->add($rule);$author = $auth->createRole('author');$author->ruleName = $rule->name;$auth->add($author);// ... 添加$author角色的子项部分代码 ... (译者注:省略部分参照之前的控制台命令)$admin = $auth->createRole('admin');$admin->ruleName = $rule->name;$auth->add($admin);$auth->addChild($admin, $author);// ... 添加$admin角色的子项部分代码 ... (译者注:省略部分参照之前的控制台命令)注意,在上述代码中,因为 "author" 作为 "admin" 的子角色,当你实现这个规则的?execute()?方法时, 你也需要遵从这个层次结构。这就是为何当角色名为 "author" 的情况下(译者注:$item->name就是角色名),?execute()?方法在组为 1 或者 2 时均要返回 true (意思是用户属于 "admin" 或者 "author" 组 )。接下来,在配置?authManager?时指定 yii\rbac\BaseManager::$defaultRoles 选项(译者注:在应用配置文件中的组件部分配置):return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\PhpManager', 'defaultRoles' => ['admin', 'author'], ], // ... ],];现在如果你执行一个存取权限检查, 判定该规则时,?admin?和?author?两个角色都将会检查。如果规则返回 true ,意思是角色符合当前用户。基于上述规则 的实现,意味着如果某用户的?group?值为 1 ,?admin?角色将赋予该用户, 如果?group?值是 2 则将赋予author?角色。

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


授权(Authorization)