در ادامه مطلب قبلی. با استفاده از rule ها این امکان وجود داره تا به عنوان مثال بتونیم مجوز بروزرسانی یک بخش به شرطی که کاربر جاری مالک(ایجاد کننده) اون باشه رو بررسی کنیم. سیستم مدیریت وبلاگ رو در نظر بگیرید. کاربران(نویسنده ها) وبلاگ فقط باید امکان بروزرسانی یا حذف مطالب خودشون رو داشته باشن. در مرحله ی اول، برای بررسی مالک هر مطلب نیاز به ایجاد یک کلاس جدید داریم. backend\components\rbac میتونه جای خوبی برای ایجاد این کلاس باشه.
<?php
namespace backend\components\rbac;
use yii\rbac\Rule;
class AuthorRule extends Rule
{
public $name = 'AuthorRule';
public function execute($user, $item, $params)
{
}
}
لازم هست کلاسمون از yii\rbac\Rule مشتق(extends) بشه. و همچنین تعریف متد execute اجباریه. در این متد user شناسه کاربر جاری، item اطلاعات مربوط به مجوز و params پارامتر هایی که ما براش تعریف میکنیم رو برمیگردونه.
فعلا از این کلاس دست میکشیم، مانند مطلب قبلی برای ذخیره ی اطلاعات مجوز ها داخل پایگاه داده از migration ها استفاده میکنم.
$rule = new \backend\components\rbac\AuthorRule();
$auth->add($rule);
$updatePost = $auth->createPermission('updatePost');
$updatePost->ruleName = $rule->name;
$auth->add($updatePost);
$auth->addChild($author, $updatePost);
تنها بخشی از سورس migration رو اینجا آوردم و قسمت دیگه ی اون در مطلب قبلی موجود هست.
ابتدا rule مورد نظرمون رو تعریف و داخل پایگاه داده قرار دادیم. بعدش یک مجوز جدید ایجاد و با استفاده از ruleName مشخص کردیم تمام کاربرانی که این مجوز رو داشته باشن میبایست از کلاس AuthorRule بگذرن و در انتها مجوز updatePost به نویسنده ها نسبت داده شد.
بعد از up کردن migration در جدول auth_rule سطر جدیدی به نام AuthorRule خواهید داشت و همچنین در auth_item یک آیتم جدید ایجاد شده(updatePost) که در فیلد rule_name نام AuthorRule قابل مشاهده است. و این یعنی آیتم ما با این کلاس ارتباط داره.
حالا اگر با کاربر نویسنده لاگین کنید و داخل کدتون چنین شرطی وجود داشته باشه مطمئن باشید در کلاس AuthorRule متد execute اجرا خواهد شد.
$model = $this->findModel($id);
if (Yii::$app->user->can('updatePost', ['post' => $model])) {
}
برمیگردیم به متد execute، اینجا باید بررسی کنیم کاربر جاری مالک مطلب مورد نظرمون هست یا نه.
public function execute($user, $item, $params)
{
return $params['post']->author_id == $user;
}
این تنها یک مثال ساده و پایه برای درک rbac و rule ها بود. قطعا روش های زیادی قابل پیاده سازی هست مثل بررسی خودکار مجوز ها و... . و همینطور کلاس های فراوانی برای مدیریت rbac داخل گیت هاب وجود داره که میتونید در آینده بررسیشون کنید.