Role and Permission

هیچ عنوان درخوری نتونستم پیدا کنم برای این پست؛ پس تصمیم گرفتم انگلیسی رو بغل کنم. ببخشید! 😁.
فکر نکنم نیاز باشه زیاد درباره این پست حرف بزنم. فقط باید بگم یکی از اصلی‌ترین قسمت‌های سایت‌ها همین قسمت هست؛ چون مدیران نمی‌خوان که همه بتونند هرکاری که امکانش هست رو انجام بدند.

📩 با عضویت در خبرنامه، جدیدترین مطالب و آموزش‌ها را مستقیم در ایمیل خود دریافت کنید.

خبرنامه

شاید این روشی که من امروز بهتون می‌خوام نشون بدم بهینه‌ترین روش نباشه اما یه راهی هست برای برطرف کردن نیازمون.

شروع کار

نیاز نیست که بگم اولین کار درست کردن یک پروژه لاراولی هست چون خودتون خوب می‌دونید.
قبل از هر چیزی نیاز داریم که توی جدول User یک تعداد تغییر انجام بدیم و بعد از اون یک جدول جدید درست کنیم به اسم Role که اصلی‌ترین قسمت این آموزش رو این جدول قراره انجام بده.

User Table :

Php artisan make:migration "add role_id to users"
Code language: JavaScript (javascript)
Schema::table('users', function (Blueprint $table) {  
   $table->unsignedBigInteger("role_id")->after("id");  
});
Code language: PHP (php)

Role Table :

php artisan make:model Role -m
Code language: CSS (css)
Schema::create('roles', function (Blueprint $table) {  
    $table->id();  
    $table->string("name");  
    $table->longText("scope");  
    $table->softDeletes();  
    $table->timestamps();  
});
Code language: PHP (php)

با کد بالا هم Model رو ساختیم هم Migration رو.
دوست داشتید می‌تونید Seeder هم بسازید که کارتون برای اولش ساده‌تر بشه.

 پیاده‌سازی

بعد از مراحل بالا، ساخت Middleware برای بررسی درخواست‌ها هست.

php artisan make:middleware RoleManager
Code language: CSS (css)
public function handle(Request $request, Closure $next, string $scope = ''){  
    $scopes = json_decode(Auth::user()->role->scope);  
    if (!in_array($scope, $scopes))  
        abort(403);  
    return $next($request);  
}
Code language: PHP (php)

کد بالا از شما یه مجوز می‌گیره و بعد از کاربر می‌خواد مجوزهایی که داره رو بده بهش. چک می‌کنه ببینه مجوزی که ما دادیم رو کاربر داره یا نه!

یادتون نره که Middleware رو داخل فایل app/Http/Kernel.php اضافه کنید.

protected $routeMiddleware = [  
    .  
    .  
    .  
    'role' => RoleManager::class,  
];
Code language: HTML, XML (xml)

طرز استفاده هم به این صورته:

Route::get("routename",[Controller:class,"functionName"])->name("route.name")->middleware("role:permission_name);
Code language: CSS (css)

کد بالا هم که پر واضح هست پس نیازی به توضیح نداره.
این قسمت تقریباً اضافه‌کاری هست با این حال خیلی کمک می‌کنه توی پروژه.
به Model یوزر یک تابع اضافه می‌کنیم که دقیقاً مثل Middleware بالا هست کارش.

public function may($scope){  
    $scopes = json_decode($this->role->scope);  
    if (in_array($scope, $scopes))  
        return true;  
    return false;  
}
Code language: HTML, XML (xml)

با این کد دیگه نیاز نیست هردفعه که خواستید کاربر رو بررسی کنید هی کد بالا رو بنویسید.
یادتون نره بین جدول User , Role رابطه برقرار کنید.

public function role(): BelongsTo{  
    return $this->belongsTo(Role::class);  
}
Code language: PHP (php)

 پایان

دیگه تموم شد فکر نکنم زیاد سخت بوده باشه با این روش می‌تونید Routeهای پروژه رو فیلتر کنید.
اگر خواستید قسمتی از سایت رو برای کاربران نمایش ندید بر اساس این Permissionها می‌تونید توی Blade خودتون به این صورت عمل کنید:

@if ( Auth::user()->may("permission_name") )  
    //some html or blade code  
@endif
Code language: PHP (php)

یا اگر بخواید دیگه خیلی کارخودتون رو ساده کنید توی یکی از Providerهای پروژه خودتون کد زیر رو اضافه کنید.
پشنهاد من فایل app/Providers/AppServiceProvider.php هست.

Blade::if('may', function ($scope) {  
    return Auth::user()->may($scope);  
});
Code language: PHP (php)

حالا با کمک این کد دیگه نیاز نیست از اون @if بالا استفاده کنید و فقط کافیه بنویسید:

@may ("permission_name")  
    //some html or blade code  
@endmay
Code language: HTML, XML (xml)

امیدوارم از این مقاله خوشتون آمده باشده و کارتون رو ساده کرده باشه.

پاسخی بگذارید

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