Yii Framework 2.0 Управление доступом на основе ролей RBAC

Изучение Yii Framework 2.0 Я пытался использовать управление доступом на основе ролей из документации по Yii 2.0. Но руководство по документации слишком короткое для меня, чтобы я не смог завершить это обучение. Я добавил следующий код в мой файл конфигурации.

'components' => [
'authManager' => [
'class' => 'yii\rbac\DbManager',
],
],

Я создал таблицы базы данных с помощью следующего сценария SQL.

drop table [auth_assignment];
drop table [auth_item_child];
drop table [auth_item];
drop table [auth_rule];

create table [auth_rule]
(
[name]  varchar(64) not null,
[data]  text,
[created_at]           integer,
[updated_at]           integer,
primary key ([name])
);

create table [auth_item]
(
[name]                 varchar(64) not null,
[type]                 integer not null,
[description]          text,
[rule_name]            varchar(64),
[data]                 text,
[created_at]           integer,
[updated_at]           integer,
primary key ([name]),
foreign key ([rule_name]) references [auth_rule] ([name]) on delete set null on update    cascade
);

create index [idx-auth_item-type] on [auth_item] ([type]);

create table [auth_item_child]
(
[parent]               varchar(64) not null,
[child]                varchar(64) not null,
primary key ([parent],[child]),
foreign key ([parent]) references [auth_item] ([name]) on delete cascade on update cascade,
foreign key ([child]) references [auth_item] ([name]) on delete cascade on update cascade
);

create table [auth_assignment]
(
[item_name]            varchar(64) not null,
[user_id]              varchar(64) not null,
[created_at]           integer,
primary key ([item_name], [user_id]),
foreign key ([item_name]) references [auth_item] ([name]) on delete cascade on update cascade
);

Я построил данные аутентификации со следующим.

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

При доступе к этому методу actionInit () через этот контроллер вышеуказанные таблицы базы данных были заполнены данными на основе приведенного выше кода. Кроме того, в таблице моего пользователя у меня есть два пользователя, администратор имеет идентификатор 1, а автор имеет идентификатор 2. Я использую следующий код для создания пользователя.

public function create()
{
if ($this->validate()) {
$user = new User();
$user->username = $this->username;
$user->email = $this->email;
$user->setPassword($this->password);
$user->generateAuthKey();
$user->save(false);

// the following three lines were added:
$auth = Yii::$app->authManager;
$authorRole = $auth->getRole('author');
$auth->assign($authorRole, $user->getId());

return $user;
}

return null;
}

С помощью приведенного выше кода все новые пользователи будут авторами. С помощью операторов if ниже я могу предоставить или запретить доступ.

if (\Yii::$app->user->can('createPost')) {
// create post
}

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

Все идет нормально. Все отлично работает Сценарий приведенного выше кода заключается в том, что обычный автор может создать сообщение, но не может обновить сообщение. Администратор может обновить сообщение и может сделать все, что может сделать автор. Теперь я хочу, чтобы обычный автор мог обновлять свой пост. Я не знаю, как идти дальше отсюда. Я следовал пункту Yii Guide Documentation / Secury / Authorization, основанный на контроле доступа на основе ролей (RBAC). Я никогда не использовал Yii 1. Именно поэтому я не смог разобраться с таким кратким пояснением документации RBAC для Yii 2.0.

5

Решение

Вам нужно правило доступа и документы понятны, поэтому создайте его как

namespace app\rbac;

use yii\rbac\Rule;

/**
* Checks if authorID matches user passed via params
*/
class AuthorRule extends Rule
{
public $name = 'isAuthor';

/**
* @param string|integer $user the user ID.
* @param Item $item the role or permission that this rule is associated with
* @param array $params parameters passed to ManagerInterface::checkAccess().
* @return boolean a value indicating whether the rule permits the role or permission it is associated with.
*/
public function execute($user, $item, $params)
{
return isset($params['post']) ? $params['post']->createdBy == $user : false;
}
}

затем добавьте его в свою роль RBAC

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

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

// add the "updateOwnPost" permission and associate the rule with it.
$updateOwnPost = $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);

Наконец, назначьте роль пользователю при регистрации

$auth = Yii::$app->authManager;
$authorRole = $auth->getRole('author');
$auth->assign($authorRole, $userid_here);

чтобы проверить, есть ли у пользователя возможность редактировать, используйте код ниже, где $ post — Модель для сообщений.

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

Все они взяты из руководства.
Дайте мне знать, если у вас есть какие-либо проблемы

5

Другие решения

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

в моем сценарии я изменяю $post с $model

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

тогда это работает.

0

По вопросам рекламы [email protected]