021-88881776

آموزش احراز هویت و مجوزها (Auth & Permissions) در Filament

در این مقاله، به بررسی جامع موضوع احراز هویت و مجوزها (Auth & Permissions) در Filament می‌پردازیم. آموزش Filament شامل مباحث متعددی است که احراز هویت و مجوزها از جمله مهم‌ترین آنها هستند. این مباحث در توسعه وب نقش حیاتی دارند و امنیت و کنترل دسترسی به بخش‌های مختلف برنامه را تضمین می‌کنند. Filament به عنوان یکی از فریمورک‌های محبوب برای ساخت پنل‌های مدیریتی در لاراول، ابزارهای متنوعی برای مدیریت احراز هویت و مجوزها ارائه می‌دهد. در ادامه، تمامی جنبه‌های این موضوع را از سطح مبتدی تا پیشرفته بررسی خواهیم کرد.

تنظیمات احراز هویت در Filament

احراز هویت و مجوزها (Auth & Permissions) در Filament از تنظیمات احراز هویت قدرتمندی برخوردار است که به شما امکان می‌دهد تا کاربران خود را مدیریت کنید و دسترسی‌های مناسب را به آن‌ها اختصاص دهید. در این بخش، به طور جامع‌تر به راه‌اندازی و پیکربندی احراز هویت در Filament می‌پردازیم تا بتوانید به صورت کامل این قابلیت‌ها را در پروژه‌های خود پیاده‌سازی کنید.

راه‌اندازی احراز هویت

برای شروع، ابتدا باید سیستم احراز هویت را در پروژه Filament خود پیکربندی کنید. Filament از بسته‌های معتبر Laravel مانند Laravel Breeze و Jetstream به عنوان پایه‌های احراز هویت استفاده می‌کند. در اینجا به بررسی نحوه نصب و پیکربندی هر یک از این بسته‌ها می‌پردازیم.

۱. نصب Laravel Breeze

Laravel Breeze یک بسته ساده و سبک برای احراز هویت در Laravel است که شامل امکانات پایه مانند ثبت‌نام، ورود، بازیابی رمز عبور و تایید ایمیل می‌باشد. این بسته برای پروژه‌هایی مناسب است که نیاز به یک سیستم احراز هویت ساده دارند.

مراحل نصب Laravel Breeze:
نصب بسته Laravel Breeze:

ابتدا باید بسته Laravel Breeze را با استفاده از Composer نصب کنید. برای این کار، دستور زیر را در ترمینال خود اجرا کنید:

composer require laravel/breeze --dev

نصب Breeze:

پس از نصب بسته، باید Breeze را در پروژه خود نصب کنید. این کار با اجرای دستور زیر انجام می‌شود:

php artisan breeze:install

این دستور فایل‌های مورد نیاز برای احراز هویت را به پروژه شما اضافه می‌کند.

نصب وابستگی‌های جاوااسکریپت و اجرای کامپایلر:

برای اطمینان از اینکه تمامی فایل‌های جاوااسکریپت به درستی بارگذاری می‌شوند، دستورات زیر را اجرا کنید:

npm install && npm run dev

اجرای مهاجرت‌ها:

برای ایجاد جداول لازم در پایگاه داده، باید مهاجرت‌ها را اجرا کنید:

php artisan migrate

این دستور جداول کاربران و جداول مرتبط با احراز هویت را در پایگاه داده شما ایجاد می‌کند.

۲. نصب Laravel Jetstream

اگر به دنبال یک بسته احراز هویت با امکانات پیشرفته‌تر مانند مدیریت تیم‌ها و احراز هویت دو مرحله‌ای هستید، Laravel Jetstream گزینه مناسبی است. این بسته امکانات بیشتری را نسبت به Breeze ارائه می‌دهد و برای پروژه‌هایی با نیازهای پیچیده‌تر مناسب است.

مراحل نصب Laravel Jetstream:
نصب بسته Laravel Jetstream:

ابتدا باید بسته Laravel Jetstream را با استفاده از Composer نصب کنید:

composer require laravel/jetstream

نصب Jetstream با گزینه‌های مورد نظر:

Jetstream از دو استک Livewire و Inertia.js پشتیبانی می‌کند. بسته به نیاز پروژه خود، یکی از این استک‌ها را انتخاب کنید. به عنوان مثال، برای استفاده از Livewire، دستور زیر را اجرا کنید:

php artisan jetstream:install livewire

اگر ترجیح می‌دهید از Inertia.js استفاده کنید، دستور زیر را اجرا کنید:

php artisan jetstream:install inertia

نصب وابستگی‌های جاوااسکریپت و اجرای کامپایلر:

مانند Breeze، باید وابستگی‌های جاوااسکریپت را نصب و کامپایل کنید:

npm install && npm run dev

اجرای مهاجرت‌ها:

برای ایجاد جداول لازم در پایگاه داده، مهاجرت‌ها را اجرا کنید:

php artisan migrate

این دستور جداول کاربران، تیم‌ها و سایر جداول مرتبط با Jetstream را ایجاد می‌کند.

مقایسه Laravel Breeze و Jetstream

Laravel Breeze و Laravel Jetstream هر دو ابزارهای قدرتمندی برای راه‌اندازی سیستم احراز هویت در پروژه‌های Laravel هستند. Breeze برای پروژه‌های ساده و سبک مناسب است، در حالی که Jetstream امکانات پیشرفته‌تری مانند مدیریت تیم‌ها و احراز هویت دو مرحله‌ای را ارائه می‌دهد. انتخاب بین این دو بسته بستگی به نیازهای پروژه شما دارد؛ اگر به دنبال یک سیستم احراز هویت ساده هستید، Breeze گزینه مناسبی است و اگر نیاز به امکانات پیشرفته‌تری دارید، Jetstream را انتخاب کنید.

پیکربندی فایل‌های تنظیمات

پس از نصب بسته مورد نظر، باید فایل‌های تنظیمات مربوطه را بررسی و در صورت نیاز تغییر دهید. به عنوان مثال، در Laravel Fortify که توسط Breeze و Jetstream استفاده می‌شود، می‌توانید تنظیمات مختلف احراز هویت را در فایل config/fortify.php مدیریت کنید.

مثال تنظیمات Fortify:

return [

    // سایر تنظیمات

    'features' => [
        Features::registration(),
        Features::resetPasswords(),
        Features::emailVerification(),
        Features::updateProfileInformation(),
        Features::updatePasswords(),
        Features::twoFactorAuthentication([
            'confirmPassword' => true,
        ]),
    ],

    // سایر تنظیمات

];

در اینجا می‌توانید ویژگی‌های مختلف احراز هویت را فعال یا غیرفعال کنید. به عنوان مثال، برای فعال‌سازی احراز هویت دو مرحله‌ای، می‌توانید Features::twoFactorAuthentication() را فعال کنید.

مدیریت کاربران در Filament

پس از راه‌اندازی سیستم احراز هویت، نیاز دارید تا بتوانید کاربران را از طریق پنل مدیریت Filament مدیریت کنید. Filament امکاناتی برای ایجاد، ویرایش و حذف کاربران فراهم می‌کند.

ایجاد Resource برای مدیریت کاربران

برای مدیریت کاربران در Filament، باید یک Resource مخصوص کاربران ایجاد کنید. این کار با اجرای دستور زیر انجام می‌شود:

php artisan make:filament-resource User

این دستور فایل‌های مورد نیاز برای مدیریت کاربران را ایجاد می‌کند. سپس می‌توانید قالب‌ها و فرم‌های مورد نظر خود را برای مدیریت کاربران سفارشی‌سازی کنید.

مثال مدیریت کاربران

در فایل UserResource.php می‌توانید فیلدهای نمایش داده شده در لیست کاربران و فرم‌های ایجاد و ویرایش کاربران را تعریف کنید:

namespace App\Filament\Resources;

use App\Models\User;
use Filament\Resources\Resource;
use Filament\Resources\Table;
use Filament\Resources\Form;
use Filament\Tables;
use Filament\Forms;

class UserResource extends Resource
{
    protected static ?string $model = User::class;

    protected static ?string $navigationIcon = 'heroicon-o-user';

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('name')
                    ->required()
                    ->maxLength(255),
                Forms\Components\TextInput::make('email')
                    ->email()
                    ->required()
                    ->maxLength(255),
                Forms\Components\Select::make('role')
                    ->options([
                        'admin' => 'Administrator',
                        'user' => 'User',
                        // سایر نقش‌ها
                    ])
                    ->required(),
                // سایر فیلدها
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('id')->sortable(),
                Tables\Columns\TextColumn::make('name')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('email')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('role')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('created_at')->dateTime(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DeleteAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make(),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListUsers::route('/'),
            'create' => Pages\CreateUser::route('/create'),
            'edit' => Pages\EditUser::route('/{record}/edit'),
        ];
    }
}

با این تنظیمات، می‌توانید کاربران را به راحتی از طریق پنل مدیریت Filament مدیریت کنید. این امکان به شما اجازه می‌دهد تا به صورت جامع و دقیق کاربران را کنترل و دسترسی‌های آن‌ها را مدیریت نمایید. راه‌اندازی احراز هویت و مجوزها (Auth & Permissions) در Filament به کمک بسته‌های Laravel Breeze و Jetstream، به شما امکان می‌دهد تا سیستم‌های احراز هویت قوی و امنی را در پروژه‌های خود پیاده‌سازی کنید. با استفاده از امکانات پیشرفته این بسته‌ها و ادغام آن‌ها با Filament، می‌توانید مدیریت کاربران و کنترل دسترسی‌ها را به صورت کاملاً سفارشی و موثر انجام دهید. این تنظیمات نه تنها امنیت پروژه شما را افزایش می‌دهد، بلکه تجربه کاربری بهتری را نیز برای کاربران نهایی فراهم می‌کند.

تنظیمات پیشرفته در احراز هویت و مجوزها (Auth & Permissions) در Filament

پس از راه‌اندازی پایه احراز هویت و مجوزها (Auth & Permissions) در Filament، می‌توانید با پیکربندی تنظیمات پیشرفته، امنیت و کنترل دسترسی کاربران خود را به سطح بالاتری ارتقاء دهید. در این بخش به بررسی برخی از تنظیمات پیشرفته پرداخته و نحوه پیاده‌سازی آن‌ها را با جزئیات شرح می‌دهیم.

۱. احراز هویت دو مرحله‌ای (Two-Factor Authentication)

احراز هویت دو مرحله‌ای یکی از راه‌های مؤثر برای افزایش امنیت حساب‌های کاربری است. این روش علاوه بر وارد کردن رمز عبور، از کاربر می‌خواهد یک کد تأییدیه که از طریق پیامک یا اپلیکیشن‌های معتبر تولید می‌شود را وارد کند.

راه‌اندازی احراز هویت دو مرحله‌ای

برای فعال‌سازی احراز هویت دو مرحله‌ای در Filament، می‌توانید از بسته‌های موجود در Laravel مانند laravel/fortify استفاده کنید که از این ویژگی پشتیبانی می‌کنند.

نصب Laravel Fortify:

composer require laravel/fortify

انتشار فایل پیکربندی Fortify:

php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider"

فعال‌سازی ویژگی دو مرحله‌ای در فایل config/fortify.php:

'features' => [
    Features::twoFactorAuthentication([
        'confirmPassword' => true,
    ]),
    // سایر ویژگی‌ها
],

اجرای مهاجرت‌ها:

php artisan migrate

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

مثال عملی
فرض کنید می‌خواهید کاربران بتوانند احراز هویت دو مرحله‌ای را فعال یا غیرفعال کنند. می‌توانید در صفحه پروفایل کاربر، گزینه‌ای برای مدیریت این ویژگی اضافه کنید:

// در کنترلر مربوطه
public function showProfile()
{
    return view('profile', [
        'user' => auth()->user(),
    ]);
}

// در ویو profile.blade.php
@if ($user->two_factor_secret)
    <p>احراز هویت دو مرحله‌ای فعال است.</p>
    <a href="{{ route('two-factor.disable') }}">غیرفعال کردن</a>
@else
    <p>احراز هویت دو مرحله‌ای فعال نیست.</p>
    <a href="{{ route('two-factor.enable') }}">فعال کردن</a>
@endif

۲. تایید ایمیل (Email Verification)

تایید ایمیل یکی دیگر از تنظیمات پیشرفته احراز هویت و مجوزها (Auth & Permissions) در Filament است که اطمینان می‌دهد کاربران واقعی با ایمیل معتبر ثبت‌نام می‌کنند.

فعال‌سازی تایید ایمیل
برای فعال‌سازی تایید ایمیل، مراحل زیر را دنبال کنید:

فعال‌سازی ویژگی تایید ایمیل در فایل config/fortify.php:

'features' => [
    Features::emailVerification(),
    // سایر ویژگی‌ها
],

به‌روزرسانی مدل User برای استفاده از MustVerifyEmail:

use Illuminate\Contracts\Auth\MustVerifyEmail;

class User extends Authenticatable implements MustVerifyEmail
{
    // کدهای مدل
}

تنظیم مسیرهای احراز هویت در فایل routes/web.php:

use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\Request;

Route::get('/email/verify', function () {
    return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');

Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
    $request->fulfill();
    return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');

Route::post('/email/verification-notification', function (Request $request) {
    $request->user()->sendEmailVerificationNotification();
    return back()->with('message', 'لینک تایید ایمیل به ایمیل شما ارسال شد!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

مثال عملی
فرض کنید می‌خواهید کاربران پس از ثبت‌نام، تنها پس از تایید ایمیل خود بتوانند وارد سیستم شوند. مراحل زیر را انجام دهید:

ایجاد ویو تایید ایمیل:

<!-- resources/views/auth/verify-email.blade.php -->
@extends('layouts.app')

@section('content')
<div class="container">
    <h1>تایید ایمیل</h1>
    @if (session('message'))
        <div class="alert alert-success">
            {{ session('message') }}
        </div>
    @endif
    <p>لطفاً ایمیلی که به شما ارسال شده است را بررسی کنید و بر روی لینک تایید کلیک کنید.</p>
    <form method="POST" action="{{ route('verification.send') }}">
        @csrf
        <button type="submit" class="btn btn-primary">ارسال مجدد ایمیل تایید</button>
    </form>
</div>
@endsection

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

// در کنترلر یا middleware مربوطه
public function __construct()
{
    $this->middleware(['auth', 'verified']);
}

با این تنظیمات، کاربران بدون تایید ایمیل نمی‌توانند به بخش‌های محافظت‌شده وبسایت دسترسی پیدا کنند و این امر امنیت سیستم را افزایش می‌دهد.

۳. سیاست‌های دسترسی (Access Policies)

سیاست‌های دسترسی به شما اجازه می‌دهند تا قوانین دقیق‌تری برای دسترسی کاربران به منابع مختلف تعیین کنید. این سیاست‌ها می‌توانند بر اساس نقش‌ها و دسترسی‌ها تنظیم شوند.

تعریف سیاست‌ها
برای تعریف یک سیاست دسترسی، ابتدا باید یک کلاس سیاست ایجاد کنید:

php artisan make:policy PostPolicy --model=Post

سپس در کلاس ایجاد شده، متدهای مربوط به عملیات مختلف را تعریف کنید:

use App\Models\User;
use App\Models\Post;

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

    public function delete(User $user, Post $post)
    {
        return $user->hasRole('admin');
    }
}

ثبت سیاست‌ها
سیاست‌های ایجاد شده را در فایل AuthServiceProvider ثبت کنید:

protected $policies = [
    Post::class => PostPolicy::class,
];

استفاده از سیاست‌ها در Filament
در Filament می‌توانید از سیاست‌ها برای کنترل دسترسی به منابع استفاده کنید:

use Filament\Resources\PostResource;

class PostResource extends Resource
{
    public static function authorization()
    {
        return [
            'view' => 'viewAny',
            'create' => 'create',
            'update' => 'update',
            'delete' => 'delete',
        ];
    }
}

با این تنظیمات، Filament از سیاست‌های تعریف‌شده برای کنترل دسترسی به عملیات مختلف استفاده می‌کند.

۴. محدودیت‌های دسترسی مبتنی بر زمان (Time-Based Access Restrictions)

در برخی موارد، ممکن است بخواهید دسترسی کاربران را بر اساس زمان‌های مشخص محدود کنید. برای مثال، دسترسی به بخش‌های خاصی از سایت تنها در ساعات کاری مجاز باشد.

پیاده‌سازی محدودیت‌های زمان‌بندی شده
می‌توانید با استفاده از middleware‌های سفارشی این محدودیت‌ها را اعمال کنید:

ایجاد middleware جدید:

php artisan make:middleware TimeAccess

تعریف منطق محدودیت زمان در middleware:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Carbon\Carbon;

class TimeAccess
{
    public function handle(Request $request, Closure $next)
    {
        $currentHour = Carbon::now()->hour;
        if ($currentHour < 9 || $currentHour > 17) {
            return redirect()->route('access.denied')->with('error', 'دسترسی در این زمان مجاز نیست.');
        }
        return $next($request);
    }
}

ثبت middleware در app/Http/Kernel.php:

protected $routeMiddleware = [
    // سایر middleware‌ها
    'time.access' => \App\Http\Middleware\TimeAccess::class,
];

اعمال middleware به مسیرهای مورد نظر:

Route::group(['middleware' => ['auth', 'time.access']], function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    // سایر مسیرها
});

با این تنظیمات، دسترسی به مسیرهای مشخص‌شده تنها در ساعات ۹ صبح تا ۵ بعد از ظهر مجاز خواهد بود. تنظیمات پیشرفته در احراز هویت و مجوزها (Auth & Permissions) در Filament به شما امکان می‌دهند تا سیستم امنیتی و کنترل دسترسی خود را به طور جامع و دقیق‌تری مدیریت کنید. با پیاده‌سازی ویژگی‌هایی مانند احراز هویت دو مرحله‌ای، تایید ایمیل، سیاست‌های دسترسی و محدودیت‌های زمانی، می‌توانید اطمینان حاصل کنید که تنها کاربران مجاز به بخش‌های مختلف سیستم دسترسی دارند و امنیت کلی پروژه شما بهبود یافته است.

نقش‌ها (Roles) در Filament

یکی از اجزای کلیدی احراز هویت و مجوزها (Auth & Permissions) در Filament، نقش‌ها هستند که به شما اجازه می‌دهند تا دسته‌بندی‌های مختلفی از کاربران را تعریف کنید و دسترسی‌های متفاوتی به آن‌ها اختصاص دهید. در این بخش، به طور جامع‌تری به مفهوم نقش‌ها، تعریف آن‌ها، مدیریت آن‌ها و مثال‌های عملی می‌پردازیم تا بتوانید به بهترین شکل از این قابلیت در پروژه‌های خود استفاده کنید.

تعریف نقش‌ها

نقش‌ها به شما امکان می‌دهند تا کاربران را بر اساس وظایف و مسئولیت‌هایشان دسته‌بندی کنید. این دسته‌بندی‌ها به شما کمک می‌کنند تا به صورت سازمان‌یافته و منظم دسترسی‌های مختلف را به کاربران اختصاص دهید. به عنوان مثال، می‌توانید نقش‌های «مدیر»، «کاربر معمولی»، «نویسنده»، «ویرایشگر» و غیره را تعریف کنید. هر نقش می‌تواند مجموعه‌ای از مجوزها را داشته باشد که مشخص می‌کند کاربران با آن نقش می‌توانند چه اقداماتی را در سیستم انجام دهند.

چرا نقش‌ها اهمیت دارند؟

استفاده از نقش‌ها به چند دلیل مهم است:

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

مدیریت نقش‌ها

Filament به شما ابزارهایی قدرتمند برای مدیریت نقش‌ها ارائه می‌دهد. این ابزارها به شما امکان می‌دهند تا به راحتی نقش‌ها را از طریق پنل مدیریت Filament اضافه، ویرایش یا حذف کنید. در ادامه به نحوه مدیریت نقش‌ها به تفصیل پرداخته می‌شود.

۱. ایجاد نقش جدید

برای ایجاد یک نقش جدید، می‌توانید از کد زیر استفاده کنید. در این مثال، نقش «مدیر» ایجاد می‌شود که دسترسی کامل به تمامی بخش‌های پنل مدیریتی را دارد.

use Spatie\Permission\Models\Role;

Role::create(['name' => 'admin']);

این کد با استفاده از بسته Spatie Laravel Permission، نقش جدیدی به نام «admin» ایجاد می‌کند.

۲. ویرایش نقش‌ها

برای ویرایش یک نقش موجود، می‌توانید از متدهای ارائه شده توسط بسته Spatie استفاده کنید. به عنوان مثال، اگر بخواهید نام یک نقش را تغییر دهید، می‌توانید از کد زیر استفاده کنید:

$role = Role::findByName('admin');
$role->name = 'super-admin';
$role->save();

این کد نقش «admin» را به «super-admin» تغییر می‌دهد.

۳. حذف نقش‌ها

برای حذف یک نقش، می‌توانید از متد delete استفاده کنید:

$role = Role::findByName('super-admin');
$role->delete();

این کد نقش «super-admin» را از سیستم حذف می‌کند. توجه داشته باشید که قبل از حذف نقش‌ها، باید مطمئن شوید که هیچ کاربری با این نقش وجود ندارد یا مجوزهای مرتبط با آن به درستی مدیریت شده‌اند.

۴. اختصاص مجوزها به نقش‌ها

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

use Spatie\Permission\Models\Permission;

// ایجاد مجوزهای جدید
Permission::create(['name' => 'edit articles']);
Permission::create(['name' => 'delete articles']);

// اختصاص مجوزها به نقش مدیر
$role = Role::findByName('admin');
$role->givePermissionTo(['edit articles', 'delete articles']);

این کد مجوزهای «edit articles» و «delete articles» را ایجاد کرده و به نقش «admin» اختصاص می‌دهد.

مثال عملی

برای درک بهتر نحوه استفاده از نقش‌ها در احراز هویت و مجوزها (Auth & Permissions) در Filament، یک مثال عملی ارائه می‌دهیم. فرض کنید می‌خواهید نقش «مدیر» را ایجاد کنید که دسترسی کامل به تمامی بخش‌های پنل مدیریتی داشته باشد و سپس این نقش را به کاربران خاص اختصاص دهید.

۱. ایجاد نقش «مدیر»

ابتدا باید نقش «مدیر» را ایجاد کنید. این کار را می‌توانید با استفاده از کد زیر انجام دهید:

use Spatie\Permission\Models\Role;

// ایجاد نقش مدیر
Role::create(['name' => 'admin']);

این کد یک نقش جدید به نام «admin» ایجاد می‌کند که می‌تواند به کاربران اختصاص یابد.

۲. تعریف مجوزهای لازم برای نقش «مدیر»

برای اطمینان از اینکه نقش «مدیر» دسترسی کامل به تمامی بخش‌های پنل مدیریتی دارد، باید مجوزهای لازم را به این نقش اختصاص دهید:

use Spatie\Permission\Models\Permission;

// ایجاد مجوزهای لازم
Permission::create(['name' => 'manage users']);
Permission::create(['name' => 'manage posts']);
Permission::create(['name' => 'manage settings']);

// اختصاص مجوزها به نقش مدیر
$role = Role::findByName('admin');
$role->givePermissionTo(['manage users', 'manage posts', 'manage settings']);

این کد مجوزهای «manage users»، «manage posts» و «manage settings» را ایجاد کرده و به نقش «admin» اختصاص می‌دهد.

۳. اختصاص نقش به کاربران خاص

حالا که نقش و مجوزهای مورد نیاز را تعریف کرده‌اید، می‌توانید این نقش را به کاربران خاص اختصاص دهید:

use App\Models\User;

// پیدا کردن کاربر مورد نظر
$user = User::find(1); // فرض کنید کاربر با ID=1 مدیر است

// اختصاص نقش مدیر به کاربر
$user->assignRole('admin');

این کد نقش «admin» را به کاربر با شناسه ۱ اختصاص می‌دهد. از این پس، این کاربر دارای مجوزهای تعریف‌شده در نقش «مدیر» است و می‌تواند به تمامی بخش‌های پنل مدیریتی دسترسی داشته باشد.

۴. بررسی مجوزهای کاربران در Filament

پس از اختصاص نقش‌ها و مجوزها به کاربران، می‌توانید از این مجوزها در Filament برای کنترل دسترسی به منابع مختلف استفاده کنید. به عنوان مثال، در Resource مربوط به مدیریت کاربران، می‌توانید از مجوزهای «manage users» برای تعیین اینکه آیا یک کاربر می‌تواند کاربران را مشاهده، ویرایش یا حذف کند، استفاده کنید.

use Filament\Resources\Resource;
use Filament\Resources\Table;
use Filament\Resources\Form;
use Filament\Tables;
use Filament\Forms;

class UserResource extends Resource
{
    protected static ?string $model = User::class;

    protected static ?string $navigationIcon = 'heroicon-o-user';

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('name')
                    ->required()
                    ->maxLength(255),
                Forms\Components\TextInput::make('email')
                    ->email()
                    ->required()
                    ->maxLength(255),
                Forms\Components\Select::make('role')
                    ->options([
                        'admin' => 'Administrator',
                        'user' => 'User',
                        // سایر نقش‌ها
                    ])
                    ->required(),
                // سایر فیلدها
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('id')->sortable(),
                Tables\Columns\TextColumn::make('name')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('email')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('role')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('created_at')->dateTime(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make()->visible(fn ($record) => auth()->user()->can('manage users')),
                Tables\Actions\DeleteAction::make()->visible(fn ($record) => auth()->user()->can('manage users')),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->can('manage users')),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListUsers::route('/'),
            'create' => Pages\CreateUser::route('/create'),
            'edit' => Pages\EditUser::route('/{record}/edit'),
        ];
    }
}

در این مثال، از متد can استفاده شده است تا بررسی شود آیا کاربر جاری دارای مجوز «manage users» است یا خیر. اگر کاربر دارای این مجوز باشد، امکان ویرایش و حذف کاربران برای او فعال می‌شود.

بهترین روش‌ها در مدیریت نقش‌ها

برای بهره‌مندی کامل از نقش‌ها در احراز هویت و مجوزها (Auth & Permissions) در Filament، رعایت بهترین روش‌ها اهمیت زیادی دارد:

تعریف نقش‌ها بر اساس نیازهای پروژه: قبل از ایجاد نقش‌ها، نیازهای دسترسی کاربران را به دقت تحلیل کنید و نقش‌ها را بر اساس وظایف و مسئولیت‌های واقعی تعریف کنید.
استفاده از نام‌های قابل فهم و معنادار: نام نقش‌ها باید به گونه‌ای باشد که به راحتی مفهوم وظیفه آن نقش را منتقل کند. به عنوان مثال، «admin» برای مدیران و «editor» برای ویراستاران.
مدیریت مجوزها به صورت متمرکز: مجوزها را به صورت متمرکز تعریف کنید تا بتوانید به راحتی آن‌ها را به نقش‌ها اختصاص دهید و مدیریت کنید.
بازنگری و به‌روزرسانی منظم نقش‌ها و مجوزها: با تغییر نیازهای پروژه، نقش‌ها و مجوزها را بازنگری و به‌روزرسانی کنید تا همیشه با نیازهای فعلی همخوانی داشته باشند.
استفاده از بسته‌های معتبر: بسته‌هایی مانند Spatie Laravel Permission را برای مدیریت نقش‌ها و مجوزها استفاده کنید، زیرا این بسته‌ها امکانات پیشرفته و امنیت بالایی را فراهم می‌کنند.

نقش‌ها (Roles) در احراز هویت و مجوزها (Auth & Permissions) در Filament ابزاری قدرتمند برای مدیریت دسترسی کاربران هستند. با تعریف و مدیریت نقش‌ها به صورت دقیق و سازمان‌یافته، می‌توانید امنیت سیستم خود را افزایش دهید و کنترل بهتری بر روی دسترسی‌های کاربران داشته باشید. استفاده از بسته‌های معتبر مانند Spatie Laravel Permission و ادغام آن‌ها با Filament، فرآیند مدیریت نقش‌ها و مجوزها را ساده‌تر و کارآمدتر می‌کند.

دسترسی‌ها (Permissions) در Filament

احراز هویت و مجوزها (Auth & Permissions) در Filament بدون دسترسی‌ها کامل نمی‌شود. دسترسی‌ها به شما اجازه می‌دهند تا جزئیات بیشتری از مجوزهای کاربران را کنترل کنید و اطمینان حاصل کنید که هر کاربر فقط به بخش‌هایی از سیستم دسترسی دارد که نیاز دارد. در این بخش، به طور جامع‌تری به مفهوم دسترسی‌ها، تعریف آن‌ها، مدیریت آن‌ها و مثال‌های عملی می‌پردازیم تا بتوانید به بهترین شکل از این قابلیت در پروژه‌های خود استفاده کنید.

تعریف دسترسی‌ها

دسترسی‌ها به شما امکان می‌دهند تا عملیات خاصی را به کاربران یا نقش‌ها اختصاص دهید. این عملیات می‌توانند شامل ایجاد، ویرایش، حذف و مشاهده منابع مختلف در سیستم باشند. به عنوان مثال، دسترسی به «ایجاد پست»، «ویرایش پست»، «حذف پست» و «مشاهده پست» می‌تواند تعریف شود. با تعریف دقیق دسترسی‌ها، می‌توانید کنترل کاملی بر روی عملیات‌هایی که هر کاربر می‌تواند انجام دهد، داشته باشید.

چرا دسترسی‌ها اهمیت دارند؟

استفاده از دسترسی‌ها به چند دلیل مهم است:

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

مدیریت دسترسی‌ها

Filament این امکان را فراهم می‌کند تا دسترسی‌ها را به صورت دقیق مدیریت کنید و آن‌ها را به نقش‌ها یا کاربران خاص اختصاص دهید. برای مدیریت دسترسی‌ها، معمولاً از بسته‌هایی مانند Spatie Laravel Permission استفاده می‌شود که امکانات پیشرفته‌ای برای تعریف و مدیریت دسترسی‌ها ارائه می‌دهند.

۱. ایجاد دسترسی‌های جدید

برای ایجاد یک دسترسی جدید، می‌توانید از کد زیر استفاده کنید. در این مثال، دسترسی «ایجاد پست» ایجاد می‌شود:

use Spatie\Permission\Models\Permission;

Permission::create(['name' => 'create post']);

این کد با استفاده از بسته Spatie Laravel Permission، دسترسی جدیدی به نام «create post» ایجاد می‌کند که می‌تواند به نقش‌ها یا کاربران اختصاص یابد.

۲. ویرایش دسترسی‌ها

برای ویرایش یک دسترسی موجود، می‌توانید از متدهای ارائه شده توسط بسته Spatie استفاده کنید. به عنوان مثال، اگر بخواهید نام یک دسترسی را تغییر دهید، می‌توانید از کد زیر استفاده کنید:

$permission = Permission::findByName('create post');
$permission->name = 'create new post';
$permission->save();

این کد دسترسی «create post» را به «create new post» تغییر می‌دهد.

۳. حذف دسترسی‌ها

برای حذف یک دسترسی، می‌توانید از متد delete استفاده کنید:

$permission = Permission::findByName('create new post');
$permission->delete();

این کد دسترسی «create new post» را از سیستم حذف می‌کند. توجه داشته باشید که قبل از حذف دسترسی‌ها، باید مطمئن شوید که هیچ کاربری با این دسترسی مرتبط نیست یا مجوزهای مرتبط با آن به درستی مدیریت شده‌اند.

۴. اختصاص دسترسی‌ها به نقش‌ها

پس از ایجاد دسترسی‌ها، می‌توانید آن‌ها را به نقش‌ها اختصاص دهید تا کاربران با آن نقش‌ها به این دسترسی‌ها دسترسی پیدا کنند. به عنوان مثال:

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

// پیدا کردن نقش نویسنده
$role = Role::findByName('writer');

// اختصاص دسترسی ایجاد پست به نقش نویسنده
$role->givePermissionTo('create post');

این کد دسترسی «create post» را به نقش «writer» اختصاص می‌دهد. از این پس، تمامی کاربران با نقش «writer» قادر به ایجاد پست‌ها خواهند بود.

استفاده از دسترسی‌ها در Filament

پس از تعریف و اختصاص دسترسی‌ها، باید از آن‌ها در Filament برای کنترل دسترسی به منابع مختلف استفاده کنید. این کار با استفاده از سیاست‌ها (Policies) و متدهای مجوزدهی انجام می‌شود.

۱. تعریف سیاست‌ها (Policies)

برای کنترل دسترسی به منابع مختلف، ابتدا باید سیاست‌های مربوطه را تعریف کنید. به عنوان مثال، برای کنترل دسترسی به منابع پست‌ها، می‌توانید یک سیاست به نام PostPolicy ایجاد کنید:

php artisan make:policy PostPolicy --model=Post

سپس در کلاس سیاست ایجاد شده، متدهای مربوط به عملیات مختلف را تعریف کنید:

use App\Models\User;
use App\Models\Post;

class PostPolicy
{
    public function create(User $user)
    {
        return $user->can('create post');
    }

    public function update(User $user, Post $post)
    {
        return $user->can('edit post') && $user->id === $post->user_id;
    }

    public function delete(User $user, Post $post)
    {
        return $user->can('delete post');
    }
}

۲. ثبت سیاست‌ها

سیاست‌های ایجاد شده را در فایل AuthServiceProvider ثبت کنید:

protected $policies = [
    Post::class => PostPolicy::class,
];

۳. استفاده از سیاست‌ها در Filament

در Filament، می‌توانید از سیاست‌ها برای کنترل دسترسی به عملیات‌های مختلف استفاده کنید. به عنوان مثال، در Resource مربوط به مدیریت پست‌ها، می‌توانید از سیاست‌های تعریف شده استفاده کنید:

use Filament\Resources\Resource;
use Filament\Resources\Table;
use Filament\Resources\Form;
use Filament\Tables;
use Filament\Forms;

class PostResource extends Resource
{
    protected static ?string $model = Post::class;

    protected static ?string $navigationIcon = 'heroicon-o-document-text';

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('title')
                    ->required()
                    ->maxLength(255),
                Forms\Components\Textarea::make('content')
                    ->required(),
                // سایر فیلدها
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('id')->sortable(),
                Tables\Columns\TextColumn::make('title')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('author.name')->label('Author')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('created_at')->dateTime(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make()->visible(fn ($record) => auth()->user()->can('edit post')),
                Tables\Actions\DeleteAction::make()->visible(fn ($record) => auth()->user()->can('delete post')),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->can('delete post')),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListPosts::route('/'),
            'create' => Pages\CreatePost::route('/create'),
            'edit' => Pages\EditPost::route('/{record}/edit'),
        ];
    }
}

در این مثال، دسترسی به عملیات ویرایش و حذف پست‌ها با استفاده از دسترسی‌های «edit post» و «delete post» کنترل می‌شود. تنها کاربرانی که دارای این دسترسی‌ها هستند، قادر به انجام این عملیات خواهند بود.

بهترین روش‌ها در مدیریت دسترسی‌ها

برای بهره‌مندی کامل از دسترسی‌ها (Permissions) در Filament و اطمینان از امنیت و کارایی سیستم، رعایت بهترین روش‌ها اهمیت زیادی دارد:

تعریف دسترسی‌ها بر اساس نیازهای واقعی پروژه: قبل از ایجاد دسترسی‌ها، نیازهای دسترسی کاربران را به دقت تحلیل کنید و دسترسی‌ها را بر اساس عملیات‌های واقعی تعریف کنید.
استفاده از نام‌های قابل فهم و معنادار: نام دسترسی‌ها باید به گونه‌ای باشد که به راحتی مفهوم عملیات را منتقل کند. به عنوان مثال، «create post» برای ایجاد پست و «delete user» برای حذف کاربر.
مدیریت دسترسی‌ها به صورت متمرکز: دسترسی‌ها را به صورت متمرکز تعریف کنید تا بتوانید به راحتی آن‌ها را به نقش‌ها یا کاربران اختصاص دهید و مدیریت کنید.
بازنگری و به‌روزرسانی منظم دسترسی‌ها: با تغییر نیازهای پروژه، دسترسی‌ها را بازنگری و به‌روزرسانی کنید تا همیشه با نیازهای فعلی همخوانی داشته باشند.
استفاده از بسته‌های معتبر: بسته‌هایی مانند Spatie Laravel Permission را برای مدیریت دسترسی‌ها استفاده کنید، زیرا این بسته‌ها امکانات پیشرفته و امنیت بالایی را فراهم می‌کنند.
تست دسترسی‌ها: پس از تعریف و اختصاص دسترسی‌ها، آن‌ها را به دقت تست کنید تا مطمئن شوید که دسترسی‌ها به درستی اعمال شده‌اند و کاربران فقط به بخش‌های مجاز دسترسی دارند.
مستندسازی دسترسی‌ها: دسترسی‌ها و نقش‌های تعریف شده را مستندسازی کنید تا در آینده به راحتی بتوانید آن‌ها را مدیریت و تغییر دهید.

مثال عملی

برای درک بهتر نحوه استفاده از دسترسی‌ها در احراز هویت و مجوزها (Auth & Permissions) در Filament، یک مثال عملی ارائه می‌دهیم. فرض کنید می‌خواهید دسترسی «ایجاد پست» را ایجاد کنید و آن را به نقش «نویسنده» اختصاص دهید.

۱. ایجاد دسترسی «ایجاد پست»

ابتدا باید دسترسی «ایجاد پست» را ایجاد کنید. این کار را می‌توانید با استفاده از کد زیر انجام دهید:

use Spatie\Permission\Models\Permission;

// ایجاد دسترسی ایجاد پست
Permission::create(['name' => 'create post']);

این کد یک دسترسی جدید به نام «create post» ایجاد می‌کند که می‌تواند به نقش‌ها یا کاربران اختصاص یابد.

۲. ایجاد نقش «نویسنده» و اختصاص دسترسی‌ها

سپس باید نقش «نویسنده» را ایجاد کرده و دسترسی «create post» را به آن اختصاص دهید:

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

// ایجاد نقش نویسنده
$role = Role::create(['name' => 'writer']);

// اختصاص دسترسی ایجاد پست به نقش نویسنده
$role->givePermissionTo('create post');


این کد نقش «writer» را ایجاد کرده و دسترسی «create post» را به آن اختصاص می‌دهد. از این پس، تمامی کاربران با نقش «writer» قادر به ایجاد پست‌ها خواهند بود.

۳. اختصاص نقش به کاربران خاص

حال می‌توانید نقش «nویسنده» را به کاربران خاص اختصاص دهید:

use App\Models\User;

// پیدا کردن کاربر مورد نظر
$user = User::find(2); // فرض کنید کاربر با ID=2 نویسنده است

// اختصاص نقش نویسنده به کاربر
$user->assignRole('writer');

این کد نقش «writer» را به کاربر با شناسه ۲ اختصاص می‌دهد. از این پس، این کاربر دارای دسترسی «create post» است و می‌تواند پست‌های جدید ایجاد کند.

۴. استفاده از دسترسی‌ها در Filament

در Resource مربوط به مدیریت پست‌ها، می‌توانید از دسترسی «create post» برای کنترل دسترسی به عملیات ایجاد پست استفاده کنید:

use Filament\Resources\Resource;
use Filament\Resources\Table;
use Filament\Resources\Form;
use Filament\Tables;
use Filament\Forms;

class PostResource extends Resource
{
    protected static ?string $model = Post::class;

    protected static ?string $navigationIcon = 'heroicon-o-document-text';

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('title')
                    ->required()
                    ->maxLength(255),
                Forms\Components\Textarea::make('content')
                    ->required(),
                // سایر فیلدها
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('id')->sortable(),
                Tables\Columns\TextColumn::make('title')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('author.name')->label('Author')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('created_at')->dateTime(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make()->visible(fn ($record) => auth()->user()->can('edit post')),
                Tables\Actions\DeleteAction::make()->visible(fn ($record) => auth()->user()->can('delete post')),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->can('delete post')),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListPosts::route('/'),
            'create' => Pages\CreatePost::route('/create')->can('create post'),
            'edit' => Pages\EditPost::route('/{record}/edit')->can('edit post'),
        ];
    }
}

در این مثال، از متد can استفاده شده است تا بررسی شود آیا کاربر جاری دارای دسترسی «create post» است یا خیر. اگر کاربر دارای این دسترسی باشد، امکان ایجاد پست برای او فعال می‌شود.  دسترسی‌ها (Permissions) در احراز هویت و مجوزها (Auth & Permissions) در Filament ابزاری قدرتمند برای کنترل دقیق دسترسی کاربران به عملیات‌های مختلف سیستم هستند. با تعریف و مدیریت دسترسی‌ها به صورت دقیق و سازمان‌یافته، می‌توانید امنیت سیستم خود را افزایش دهید و اطمینان حاصل کنید که هر کاربر فقط به بخش‌هایی از سیستم دسترسی دارد که نیاز دارد. استفاده از بسته‌های معتبر مانند Spatie Laravel Permission و ادغام آن‌ها با Filament، فرآیند مدیریت دسترسی‌ها را ساده‌تر و کارآمدتر می‌کند.

Filament Shield

Filament Shield یک افزونه قدرتمند برای مدیریت احراز هویت و مجوزها (Auth & Permissions) در Filament است که امکانات بیشتری را برای کنترل دسترسی‌ها فراهم می‌کند. این افزونه با ارائه ابزارهای پیشرفته و رابط کاربری ساده، فرآیند مدیریت نقش‌ها و دسترسی‌ها را برای توسعه‌دهندگان تسهیل می‌کند. در این بخش، به بررسی جامع‌تری از Filament Shield، امکانات آن، نحوه نصب و پیکربندی، و مثال‌های عملی می‌پردازیم تا بتوانید به طور کامل از این افزونه در پروژه‌های خود بهره‌مند شوید.

امکانات Filament Shield

Filament Shield با ارائه مجموعه‌ای از امکانات پیشرفته، مدیریت احراز هویت و مجوزها (Auth & Permissions) در Filament را بهبود می‌بخشد. در ادامه به بررسی مهم‌ترین امکانات این افزونه می‌پردازیم:

۱. تولید خودکار مجوزها

یکی از ویژگی‌های برجسته Filament Shield، توانایی تولید خودکار مجوزهای مربوط به مدل‌های شما است. این ویژگی به شما اجازه می‌دهد تا بدون نیاز به تعریف دستی هر مجوز، مجوزهای مورد نیاز برای هر مدل به صورت خودکار ایجاد شوند. این امر نه تنها زمان شما را صرفه‌جویی می‌کند، بلکه از احتمال اشتباه در تعریف مجوزها جلوگیری می‌کند.

مثال عملی:
فرض کنید شما یک مدل به نام Post دارید. با استفاده از Filament Shield، مجوزهای مرتبط مانند create post, edit post, delete post, و view post به صورت خودکار ایجاد می‌شوند. این مجوزها می‌توانند به نقش‌های مختلف اختصاص یابند تا کنترل دقیق‌تری بر دسترسی کاربران داشته باشید.

۲. رابط کاربری ساده

Filament Shield با ارائه یک رابط کاربری ساده و کاربرپسند در پنل مدیریت Filament، مدیریت نقش‌ها و مجوزها را بسیار آسان‌تر می‌کند. شما می‌توانید به راحتی نقش‌های جدید ایجاد کنید، مجوزها را به آن‌ها اختصاص دهید، و تغییرات لازم را اعمال کنید بدون اینکه نیازی به دستورات پیچیده داشته باشید.

مثال عملی:
از طریق بخش Shield در پنل مدیریت Filament، می‌توانید با چند کلیک ساده نقش جدیدی ایجاد کنید و مجوزهای مورد نیاز را به آن اختصاص دهید. همچنین می‌توانید نقش‌های موجود را ویرایش یا حذف کنید.

۳. یکپارچگی با سایر بسته‌ها

Filament Shield به خوبی با سایر بسته‌های Laravel و Filament یکپارچه می‌شود. این افزونه به گونه‌ای طراحی شده است که با بسته‌های محبوب مانند Spatie Laravel Permission هماهنگی کامل داشته باشد، بنابراین می‌توانید از قابلیت‌های آن‌ها به همراه Filament Shield بهره‌مند شوید.

مثال عملی:
اگر شما از بسته Spatie Laravel Permission برای مدیریت نقش‌ها و مجوزها استفاده می‌کنید، Filament Shield به طور خودکار با این بسته هماهنگ می‌شود و امکان مدیریت پیشرفته‌تری را فراهم می‌کند.

نصب Filament Shield

نصب Filament Shield بسیار ساده و سریع است. در ادامه مراحل نصب و پیکربندی این افزونه را توضیح می‌دهیم:

۱. نصب با استفاده از Composer

برای نصب Filament Shield، ابتدا باید از طریق Composer این بسته را به پروژه خود اضافه کنید. دستور زیر را در ترمینال خود اجرا کنید:

composer require filament-shield/filament-shield

۲. پیکربندی Filament Shield

پس از نصب بسته، باید پیکربندی‌های لازم را انجام دهید. برای این کار، دستورات زیر را اجرا کنید:

php artisan filament-shield:install
php artisan migrate

دستور اول Filament Shield را نصب کرده و فایل‌های پیکربندی لازم را اضافه می‌کند. دستور دوم، مهاجرت‌های مربوط به جداول نقش‌ها و مجوزها را در پایگاه داده شما اجرا می‌کند.

۳. تنظیمات اولیه

پس از نصب، باید تنظیمات اولیه را انجام دهید. این تنظیمات معمولاً شامل تعریف نقش‌های پیش‌فرض و مجوزهای مرتبط با آن‌ها می‌شود. می‌توانید این کار را از طریق فایل‌های پیکربندی یا پنل مدیریت Filament انجام دهید.

مثال عملی
برای درک بهتر نحوه استفاده از Filament Shield در مدیریت احراز هویت و مجوزها (Auth & Permissions) در Filament، یک مثال عملی ارائه می‌دهیم. فرض کنید می‌خواهید یک نقش جدید به نام «مدیر محتوا» ایجاد کنید که دسترسی‌های خاصی به مدیریت پست‌ها داشته باشد.

۱. ایجاد نقش جدید با استفاده از پنل مدیریت

پس از نصب و پیکربندی Filament Shield، به پنل مدیریت Filament وارد شوید و به بخش Shield بروید. در اینجا می‌توانید نقش‌های جدید ایجاد کنید و مجوزهای مورد نیاز را به آن‌ها اختصاص دهید.

ایجاد نقش «مدیر محتوا»:
به بخش Shield در پنل مدیریت بروید.
روی دکمه «ایجاد نقش جدید» کلیک کنید.
نام نقش را «مدیر محتوا» وارد کنید.
مجوزهای مربوط به مدیریت پست‌ها مانند create post, edit post, delete post را به این نقش اختصاص دهید.
تغییرات را ذخیره کنید.

۲. اختصاص نقش به کاربران خاص

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

use App\Models\User;

// پیدا کردن کاربر مورد نظر
$user = User::find(3); // فرض کنید کاربر با ID=3 مدیر محتوا است

// اختصاص نقش مدیر محتوا به کاربر
$user->assignRole('مدیر محتوا');

این کد نقش «مدیر محتوا» را به کاربر با شناسه ۳ اختصاص می‌دهد. از این پس، این کاربر قادر به ایجاد، ویرایش و حذف پست‌ها خواهد بود.

۳. کنترل دسترسی در Resource مربوط به پست‌ها

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

use Filament\Resources\Resource;
use Filament\Resources\Table;
use Filament\Resources\Form;
use Filament\Tables;
use Filament\Forms;

class PostResource extends Resource
{
    protected static ?string $model = Post::class;

    protected static ?string $navigationIcon = 'heroicon-o-document-text';

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('title')
                    ->required()
                    ->maxLength(255),
                Forms\Components\Textarea::make('content')
                    ->required(),
                // سایر فیلدها
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('id')->sortable(),
                Tables\Columns\TextColumn::make('title')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('author.name')->label('Author')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('created_at')->dateTime(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make()->visible(fn ($record) => auth()->user()->can('edit post')),
                Tables\Actions\DeleteAction::make()->visible(fn ($record) => auth()->user()->can('delete post')),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->can('delete post')),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListPosts::route('/'),
            'create' => Pages\CreatePost::route('/create')->can('create post'),
            'edit' => Pages\EditPost::route('/{record}/edit')->can('edit post'),
        ];
    }
}

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

بهترین روش‌ها در استفاده از Filament Shield

برای بهره‌مندی کامل از Filament Shield و اطمینان از امنیت و کارایی سیستم، رعایت بهترین روش‌ها اهمیت زیادی دارد:

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

استفاده از نام‌های معنادار: نام نقش‌ها و مجوزها باید به گونه‌ای باشد که به راحتی مفهوم وظیفه و دسترسی آن‌ها را منتقل کند. به عنوان مثال، «مدیر محتوا» برای نقش‌هایی که مدیریت پست‌ها را بر عهده دارند مناسب است.

مدیریت متمرکز دسترسی‌ها: دسترسی‌ها را به صورت متمرکز تعریف و مدیریت کنید تا بتوانید به راحتی آن‌ها را به نقش‌ها اختصاص دهید و تغییرات لازم را اعمال کنید.

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

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

مستندسازی نقش‌ها و مجوزها: نقش‌ها و مجوزهای تعریف شده را مستندسازی کنید تا در آینده به راحتی بتوانید آن‌ها را مدیریت و تغییر دهید.

استفاده از بسته‌های معتبر: از بسته‌هایی مانند Spatie Laravel Permission به همراه Filament Shield استفاده کنید تا از امکانات پیشرفته و امنیت بالای آن‌ها بهره‌مند شوید.

Filament Shield به عنوان یک افزونه قدرتمند برای مدیریت احراز هویت و مجوزها (Auth & Permissions) در Filament، ابزارهای پیشرفته‌ای را برای کنترل دقیق دسترسی‌ها فراهم می‌کند. با استفاده از امکاناتی مانند تولید خودکار مجوزها، رابط کاربری ساده، و یکپارچگی با سایر بسته‌ها، می‌توانید فرآیند مدیریت نقش‌ها و دسترسی‌ها را به طور قابل توجهی ساده‌تر و کارآمدتر کنید. این افزونه نه تنها امنیت پروژه شما را افزایش می‌دهد، بلکه مدیریت دسترسی‌ها را نیز برای توسعه‌دهندگان تسهیل می‌کند.

نتیجه‌گیری

در این مقاله جامع به بررسی احراز هویت و مجوزها (Auth & Permissions) در Filament پرداختیم و تمامی جنبه‌های این موضوع را از سطح مبتدی تا پیشرفته مورد بررسی قرار دادیم. با استفاده از ابزارهایی مانند Laravel Breeze و Jetstream، سیستم احراز هویت قوی و امنی را در پروژه‌های خود پیاده‌سازی کردید. همچنین، با تعریف و مدیریت نقش‌ها (Roles) و دسترسی‌ها (Permissions) به کمک بسته‌های معتبر مانند Spatie Laravel Permission، توانستید کنترل دقیقی بر دسترسی کاربران به بخش‌های مختلف سیستم داشته باشید.

افزونه Filament Shield نیز با امکانات پیشرفته‌ای همچون تولید خودکار مجوزها، رابط کاربری ساده و یکپارچگی با سایر بسته‌های Laravel، فرآیند مدیریت احراز هویت و مجوزها (Auth & Permissions) در Filament را به مراتب آسان‌تر و کارآمدتر کرده است. این افزونه به شما امکان می‌دهد تا نقش‌ها و دسترسی‌ها را به صورت دقیق و بدون نیاز به کد نویسی پیچیده مدیریت کنید.

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

آموزش احراز هویت و مجوزها (Auth & Permissions) در Filament

دیدگاه های شما

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

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