මොඩියුලය 9

පරිශීලක කාර්යභාර සහ ප්‍රවේශ පාලනය (User Roles & Authorization)


1 Authentication vs. Authorization

මෙම සංකල්ප දෙක බොහෝ විට එකිනෙක පැටලෙන නමුත්, ඒවායේ පැහැදිලි වෙනසක් ඇත:

  • 🔐 Authentication (සත්‍යාපනය): "ඔබ කවුද?" යන්න තහවුරු කිරීම. (උදා: නිවැරදි email සහ password ලබා දී ලොග් වීම).
  • 🔑 Authorization (බලය පැවරීම): "ඔබට මෙය කිරීමට අවසර තිබේද?" යන්න තීරණය කිරීම. (උදා: ලොග් වූ පරිශීලකයා Admin කෙනෙක්ද, එසේ නම් පමණක් වාර්තා බැලීමට ඉඩ දීම).

3 වන මොඩියුලයේදී අපි Authentication (Breeze මගින්) සම්පූර්ණ කළෙමු. දැන් අපි Authorization ක්‍රියාත්මක කරමු.

2 Laravel Gates: සරල ප්‍රවේශ පාලනය

Laravel Gates යනු පරිශීලකයෙකුට යම් ක්‍රියාවක් කිරීමට අවසර තිබේද යන්න තීරණය කරන සරල Closure-based (function-based) ක්‍රමයකි. මේවා සාමාන්‍යයෙන් `AuthServiceProvider` නම් ගොනුවේ `boot()` method එක තුළ නිර්වචනය කරනු ලැබේ.

Gate එකක් නිර්වචනය කිරීම:

`app/Providers/AuthServiceProvider.php` ගොනුව විවෘත කර, `boot()` method එක තුළ පහත කේතය එක් කරන්න.

// In app/Providers/AuthServiceProvider.php use Illuminate\Support\Facades\Gate; use App\Models\User; public function boot(): void { Gate::define('access-admin-features', function (User $user) { return $user->role === 'admin'; }); }

මෙම `access-admin-features` නම් Gate එක, ලොග් වී සිටින පරිශීලකයාගේ (`$user`) `role` එක 'admin' නම් `true` අගයක් ද, එසේ නොමැති නම් `false` අගයක් ද ආපසු ලබා දේ.

⭐ ප්‍රායෝගික පැවරුම: Admin-Only පිටු සඳහා ප්‍රවේශය සීමා කිරීම

පියවර 1: `users` වගුවට `role` තීරුව එක් කිරීම

ඔබගේ `..._create_users_table.php` migration ගොනුව විවෘත කර, `password` තීරුවට පසුව `role` තීරුව එක් කරන්න. ඉන්පසු දත්ත සමුදාය refresh කරන්න (`php artisan migrate:fresh`).

// ... $table->string('password'); $table->string('role')->default('cashier'); // 'admin' or 'cashier' // ...

පියවර 2: `AuthServiceProvider` හි Gate එක නිර්වචනය කිරීම

ඉහත උදාහරණයේ පෙන්වා ඇති පරිදි, `AuthServiceProvider.php` ගොනුවේ `access-admin-features` Gate එක නිර්වචනය කරන්න.

පියවර 3: Blade View එක තුළ Gate එක භාවිත කිරීම (`@can`)

Admin කෙනෙකුට පමණක් පෙනිය යුතු මෙනු අයිතම (menu items) හෝ බොත්තම් සැඟවීමට `@can` blade directive එක භාවිතා කළ හැක. ඔබගේ ප්‍රධාන navigation layout ගොනුව (`layouts/navigation.blade.php`) සංස්කරණය කරන්න.

<!-- Only show this link if the user can 'access-admin-features' --> @can('access-admin-features') <x-nav-link :href="route('reports.index')"> {{ __('Reports') }} </x-nav-link> @endcan

පියවර 4: Controller එක තුළ Gate එක භාවිත කිරීම

යම් Controller method එකක් ක්‍රියාත්මක කිරීමට පෙර අවසරය පරීක්ෂා කිරීමට `authorize` method එක භාවිතා කළ හැක. `ReportController` හි `index` method එකේ ආරම්භයටම මෙම පේළිය එක් කරන්න.

// In ReportController.php -> index() public function index(Request $request) { $this->authorize('access-admin-features'); // ... rest of the code }

පරීක්ෂා කිරීම: `php artisan migrate:fresh --seed` (seed එකක් ඇත්නම්) මගින් දත්ත සමුදාය නැවත සකසා, 'cashier' කෙනෙක් ලෙස ලියාපදිංචි වන්න. දැන්, වාර්තා පිටුවට (`/reports`) සෘජුවම පිවිසීමට උත්සාහ කරන්න. ඔබට **"403 | THIS ACTION IS UNAUTHORIZED"** ලෙස දෝෂ පණිවිඩයක් දිස්වන්නේ නම්, ඔබගේ Authorization පද්ධතිය සාර්ථකව ක්‍රියාත්මක වේ!

‹‹ පෙර මොඩියුලය (Module 8) ඊළඟ මොඩියුලය (Module 10) ››