yiisoft / yii2

Yii 2: The Fast, Secure and Professional PHP Framework
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
14.24k stars 6.91k forks source link

Problem hierarchy RBAC #3481

Closed incrize closed 10 years ago

incrize commented 10 years ago

I am trying check access with rules. From the documentation (https://github.com/yiisoft/yii2/blob/master/docs/guide/security-authorization.md#role-based-access-control-rbac):

$auth = Yii::$app->authManager;

// add "updatePost" permission
$updatePost = $auth->createPermission('updatePost');
$updatePost->description = 'Update post';
$auth->add($updatePost);

$author = $auth->createRole('author');
$auth->add($author);

// 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);

// add the rule
$rule = new \app\rbac\AuthorRule;
$auth->add($rule);

// add the "updateOwnPost" permission and associate the rule with it.
$updateOwnPost = $this->auth->createPermission('updateOwnPost');
$updateOwnPost->description = 'Update own post';
$updateOwnPost->ruleName = $rule->name;
$auth->add($updateOwnPost);

// "updateOwnPost" will be used from "updatePost"
$auth->addChild($updateOwnPost, $updatePost);

// allow "author" to update their own posts
$auth->addChild($author, $updateOwnPost);

Result: Assignment: UserID 1 | admin UserID 2 | author

Item child (parent | child): admin | author author | updateOwnPost updateOwnPost | updatePost admin | updatePost

When executed:

if (\Yii::$app->user->can('updatePost', ['post' => $post])) {
    // update post
}

Permission updatePost have 2 way to role admin: 1) updatePost -> admin 2) updatePost -> updateOwnPost -> author -> admin

Example from documentation works, becouse SQL query (https://github.com/yiisoft/yii2/blob/master/framework/rbac/DbManager.php#L115):

SELECT `parent` FROM `auth_item_child` WHERE `child`='updatePost'

return parent sorted by name.

incrize commented 10 years ago

Слишком сумбурное описание получилось, извиняюсь. Вопрос был по работе RBAC, а именно по методу checkAccessRecursive. Cмутил момент, когда возможен вариант перебора всех разрешений. Т. е. например если бы роль была не admin, а например wTestAdmin, тогда для пользователя, чья роль wTestAdmin, проверка updatePost будет происходить так:

1) updatePost - разрешение несвязанно с пользователем напрямую, поэтому проверка пойдет вверх рекурсивно по родительским разрешениям 2) updateOwnPost - будет выполнена проверка на владельца, если не успешно, рекурсия продолжается 3) author - роль не связанна с пользователем 4) wTestAdmin - роль связанна с пользователем, возвращается true

Если все именно так, думаю нужно описать в документации такое поведение.