سطح دسترسی RBAC در Yii2 (قسمت اول)

سطح دسترسی RBAC در Yii2 :

یکی از راه های مدیریت سطح دسترسی در کاربران استفاده از RBAC می باشد
RBAC مخفف Role Based Access Control هست .
برای فعال سازی RBAC در Yii2 باید مراحل زیر را انجام دهیم :
ابتدا باید کد زیر را در تنظیمات پروژه اعمال کنیم:

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


توجه داشته باشین اگر از basic استفاده میکنین باید در web.php در فولدر config و در قسمت components اعمال شود
اما اگر از advanced استفاده می کنید باید در main.php در فولدر common و در فولدر config اعمال شود.
وقتی از dbmanager استفاده می کنیم باید جدول های مخصوص به اون رو هم ایجاد کنیم:

فریم ورک با استفاده از migration امکان ایجاد جداول به صورت اتوماتیک را فراهم کرده است
با اجرای کد زیر migration ما ایجاد می شود

yii migrate --migrationPath=@yii/rbac/migrations


جداولی که ایجاد می شوند شامل :
auth_rule
auth_item
auth_item_child
auth_assignment

نکته این که با استفاده از authManager میتوانید به نقش ها دسترسی داشته باشین \Yii::$app->authManager.

برای اعمال سطح دسترسی ها و نقش ها و همچنین نسبت دادن آنها به کاربر باید کد زیر را اجرا کنیم:

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


میتونین کد بالا را در اکشن یک کنترلر اجرا کنین یا مانند مثال سایت فریم ورک آن را در یک کنسول consol اجرا کنین
برای اینکار اگر از basic استفاده میکنین باید در فولدر commands یک کنترلر با نام RbacController ایجاد کنین و کد زیر را داخل آن قرار دهید :

 
namespace app\commands;
use Yii;
use yii\console\Controller
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);
    }
}


همچنین اگر از advaned اسفاده میکنین
باید در فولدر console در داخل فولدر controllers یک کنترلر به همان نام ایجاد کرده و کد بالا را در آن قرار دهید.
برای اجرای آن ها نیز در cmd کد yii rbac/init را وارد نمایید تا دستورات اجرا شوند.
فقط نکته اینکه اگر از ورژن advanced باید در قسمت فراخوانی namespace بر خلاف basic که از کد زیر استفاده میکرد

namespace app\commands;
use Yii;
use yii\console\Controller;


باید از کد زیر استفاده کنین:

namespace console\controllers;
 use Yii;
use yii\console\Controller;

نتیجه ی کد های بالا به این صورت هست :
ما دوسطح دسترسی تعریف کردیم که ثبت و ویرایش پست یا یک نوشته را مدیریت میکند
بعدش اومدیم ۲تا نقش تعریف کردیم مدیر و نویسنده
سپس اومدیم گفتیم که شخصی که نویسنده است می تواند نوشته یا پست را ثبت کند
و شخصی که مدیر هست میتواند کارهایی که نویسنده انجام میدهد را انجام دهد و همچنین پست ها را نیز ویرایش کند.
در آخر هم گفتیم کاربر با شناسه ی ۱ مدیر است و کاربر با شناسه ۲ نویسنده .

با مثال ساده نحوه ی نقش دهی به کاربر را بررسی می کنیم
به کد زیر دقت کنین. پس از ثبت نام کاربر می توانیم به صورت زیر نقش موردنظر خود را به او نسبت دهیم :

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);
        // the following three lines were added:
        $auth = Yii::$app->authManager;
        $authorRole = $auth->getRole('author');
        $auth->assign($authorRole, $user->getId());
        return $user;
    }
    return null;
}

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *