احسان رضایی

یک توسعه دهنده

درس های yii2 شماره 20: کنترل سطح دسترسی RBAC، استفاده از rule ها

در yii2 , / تاریخ ارسال 13-05-1396 / 0 نظر / آخرین ویرایش 31-01-1403

در ادامه مطلب قبلی. با استفاده از 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 داخل گیت هاب وجود داره که میتونید در آینده بررسیشون کنید.

پیشنهاد

کتاب‌ها

کتاب الگوهای طراحی به بیان ساده(design patterns / دیزاین پترن)

در مهندسی نرم افزار، design patterns(الگوهای طراحی) راه حل‌های قابل استفاده برای مشکلاتی هستند که معمولاً در طراحی نرم‌افزار اتفاق می افتند.

طرح های از پیش ساخته شده‌ای که می‌توانید برای حل مشکلات آن‌ها را سفارشی کنید. شما نمی‌توانید یک الگو را با جستجو در stackoverflow پیدا و در برنامه خود کپی کنید. الگو ها یک قطعه کد خاص نیستند، مفاهیم کلی برای حل مشکلات خاص هستند. شما باید با درک این مفاهیم آن‌ها را در برنامه خود پیاده‌سازی کنید.

کتاب refactoring / ریفکتورینگ

Refactoring مجموعه‌ای از تکنیک‌هاست که به منظور اصلاح و بهبود کدهای قبلی بدون تغییر در عملکرد و رفتارشان جهت خوانایی، کارامدی و قابلیت نگهداری بیشتر انجام می‌شود.

در کتاب Refactoring اثر Martin Fowler نوشته شده: refactoring تکنیک مرتب/منظم سازی برای تجدید ساختار کد موجود است. تغییر ساختار داخلی کد بدون تغییر رفتار خارجی آن.

refactoring یک سرمایه‌گذاری و راه حلی برای مقابله با کد کثیف و بدهی فنی است که باعث کاهش هزینه‌های توسعه نرم‌افزار در آینده خواهد شد.

ارسال نظر