ایجاد کنترل دسترسی کاربر با Gate و Policy در لاراول

در نوشته قبلی کنترل دسترسی کاربر با استفاده میان افزار (Middlewares) لاراول نوشتیم, هم اکنون می خواهیم کنترل دسترسی کاربر با استفاده از Gate و Policy لاراول آموزش دهیم.

استفاده از دروازه (Gate):

۱. اضافه کردن جدول user_type

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->string('user_type')->default('user')->nullable();
            $table->rememberToken();
            $table->timestamps();
        });
    }

در جدول user_type به صورت پیش فرض مقدار user را ثبت می کند.

یک سیاست برای کاربران ایجاد کنید. فایل در مسیر app/Providers/AuthServiceProvider.php را باز کنید و کد زیر را اضافه کنید:

use Illuminate\Contracts\Auth\Access\Gate as GateContract;

public function boot(GateContract $gate)
    {
        $this->registerPolicies($gate);

        $gate->define('Admin', function($user){
            return $user->user_type == 'admin';
        });

        $gate->define('User', function($user){
            return $user->user_type == 'user';
        });
    }

دو دسترسی برای ادمین و کاربران را ایجاد کردیم.

۲. محدود کردن دسترسی با @can و @cannot (مستندات)

با کد زیر می توانید در فایل View استفاده و محدود کنید:

@can('Admin')
    <div class="test">میزکار</div>
@endcan

@cannot('Admin')
    <div class="test">میزکار</div>
@endcannot

کد بالا کاربر ادمین (Admin) به آن بخش دسترسی دارد و یا با تغییر User کاربر معمولی به آن بخش دسترسی پیدا کند.

۳. استفاده در کنترلر (Controller)

با کد زیر می توانید از طریق Controller هر بخشی رو برای کاربران محدود کنید:

public function create()
    {
        if(!\Gate::allows('User')){
            abort(403, "برای ارسال نوشته در سایت عضو شوید.");
        }
        return view('cytus.create');
    }

استفاده از سیاست (Policy):

سیاست (Policy) لاراول یک کلاس است، که در آن شما می‌توانید منطق اجازه درخواست خود را سازمان دهی کنید. برای مثال ممکن است یک وبلاگ لاراول داشته باشید و بخواهید از آن محافظت کنید که تنها کاربرانی که پست بلاگ خود را دارند می‌توانند آن را حذف کنند.

۱. مدل فایل Post را ایجاد کنید:

php artisan make:model Post -m

۲. در فایل create_postes_table جدول های زیر را اضافه کنید:

Schema::create('posts', function (Blueprint $table) {
     $table->increments('id');
     $table->string('title');
     $table->text('content');
     $table->boolen('status');
     $table->integer('user_id');
     $table->timestamps();
});

۳. دستور زیر را وارد کنید تا جدول ها در پایگاه داده ایجاد شود:

php artisan migrate

۴. فایل سیاست با نام PostPolicy را ایجاد کنید. در پوشه app/Policies قرار می گیرد.

php artisan make:policy PostPolicy

۵. فایل مدل با نام PostPolicy ایجاد کنید:

php artisan make:policy PostPolicy --model=Post

۶. کد زیر را داخل کلاس PostPolicy اضافه کنید:

use App\User;

public function delete(User $user, Post $post)
{
  return $user->id === $post->user_id;
}

کد بالا به این معنی است خود کاربر عضو شده برای حذف نوشته ها به آن دکمه حذف دسترسی دارد و دیگر کاربران که عضو نیستند به آن دکمه حذف دسترسی پیدا نخواهد کرد.

۷. فایل در مسیر app/Providers/AuthServiceProvider.php باز کرده و کد $policies را در داخل کلاس AuthServiceProvider وارد کنید:

namespace App\Providers;

use App\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
        Post::class => PostPolicy::class,
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        //
    }
}

۸. مثل نوشته بالاتر می توانید در هر بخشی را محدود کنید:

@can('delete', $post)
  // نمایش دکمه حذف
@endcan

@cannot('delete', $post)
  // غیر فعال سازی دکمه حذف
@endcannot

۹. در مدل Post می توانید کد زیر را بکار بگیرید:

if ($user->can('delete', $post)) {
  // اضافه کردن عملیات ها
}

۱۰. در کنترلر می توانید کد زیر را به کار بگیرید:

public function delete(Post $post)
{
  $this->authorize('delete', $post);
}

پیوند larashout

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

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