تسجيل الدخول والتسجيل وحماية المسارات في Laravel
بعد أن تعلمنا في الدروس السابقة كيفية التعامل مع قواعد البيانات و Models و Eloquent والعلاقات، ثم تعرفنا على Factories وSeeders وFaker لإنشاء البيانات التجريبية، حان الوقت للانتقال إلى جزء أساسي في معظم تطبيقات الويب: Authentication أو نظام المصادقة.
إذا كنت تبني موقعًا للمقالات، متجرًا إلكترونيًا، لوحة تحكم، منصة تعليمية أو نظامًا لإدارة المستخدمين، فمن الطبيعي أن تحتاج إلى معرفة:
- من هو المستخدم الذي قام بتسجيل الدخول؟
- كيف يمكن للمستخدم إنشاء حساب؟
- كيف يسجل الدخول؟
- كيف يسجل الخروج؟
- كيف تمنع الزائر غير المسجل من الوصول إلى لوحة التحكم؟
- كيف تسمح للمستخدم المسجل فقط بإنشاء مقال؟
- كيف تتعامل مع كلمة المرور بطريقة آمنة؟
- كيف تعرف المستخدم الحالي داخل Controller أو View؟
Laravel يوفر أدوات متكاملة لهذه المهام، ويعتمد نظام المصادقة الأساسي على مفهومين مهمين هما Guards وProviders، كما يوفر Middleware باسم auth لحماية المسارات.
في هذا الدرس سنتعرف على هذه المفاهيم خطوة بخطوة، وسنربطها بما تعلمناه سابقًا.
ما هو Authentication؟
كلمة Authentication تعني التحقق من هوية المستخدم.
بمعنى أبسط: عندما يكتب المستخدم البريد الإلكتروني وكلمة المرور، يحتاج التطبيق إلى التحقق من أن البيانات صحيحة وأن هذا المستخدم موجود بالفعل.
مثلًا :
Email: ahmed@example.com Password: ********
يقوم Laravel بالتحقق من البيانات، وإذا كانت صحيحة يتم اعتبار المستخدم Authenticated.
بعد ذلك يمكن للتطبيق معرفة أن هذا المستخدم هو المستخدم الحالي.
يمكن تصور العملية بالشكل التالي:
المستخدم ↓ Login Form ↓ Email + Password ↓ Laravel Authentication ↓ التحقق من البيانات ↓ إنشاء Session ↓ المستخدم أصبح مسجل الدخول
Authentication و Authorization
هناك مصطلحان متشابهان جدًا، لكن الفرق بينهما مهم.
Authentication
يعني:
من أنت؟
مثلًا:
هل هذا المستخدم مسجل الدخول؟
Authorization
يعني:
ماذا يسمح لك أن تفعل؟
مثلًا:
هل هذا المستخدم يستطيع حذف المقال؟
إذا كان المستخدم مسجل الدخول، فهذا Authentication.
أما إذا كان يستطيع حذف المقال لأنه مدير، فهذا Authorization.
سنركز في هذا الدرس على Authentication، وسنتوسع في Authorization والصلاحيات في درس لاحق.
كيف يعمل Authentication في Laravel؟
يعتمد نظام Authentication في Laravel على عدة أجزاء تعمل معًا.
أهمها:
- User Model
- Authentication Guards
- User Providers
- Sessions
- Middleware
- Auth Facade
- Starter Kits
يشرح Laravel رسميًا أن الـ Guards تحدد كيفية مصادقة المستخدم في كل طلب، بينما الـ Providers تحدد كيفية استرجاع المستخدم من التخزين الدائم مثل قاعدة البيانات.
في تطبيقات الويب التقليدية، يستخدم Laravel عادةً Session Guard للحفاظ على حالة تسجيل الدخول باستخدام Session وCookies.
User Model
من الأشياء التي رأيناها منذ بداية الكورس Model المستخدم:
app/Models/User.php
هذا الـ Model يمثل المستخدم الموجود في جدول:
users
وعادةً يحتوي جدول المستخدمين على بيانات مثل:
id name email password created_at updated_at
يمكنك رؤية المستخدمين باستخدام Eloquent:
$users = User::all();
لكن Authentication يستخدم هذا Model أيضًا للتعرف على المستخدمين والتحقق من بياناتهم.
جدول users
عادةً يحتاج نظام Authentication إلى جدول للمستخدمين.
إذا كان المشروع الذي أنشأته يحتوي على Migration للمستخدمين، فستجد جدول users بعد تشغيل:
>php artisan migrate
يمكنك التحقق من قاعدة البيانات ورؤية المستخدمين الموجودين فيها.
ومع استخدام Factories التي تعلمناها في الدرس السابق، يمكنك إنشاء مستخدمين تجريبيين:
User::factory()->count(10)->create();
وهذا مفيد جدًا أثناء تطوير نظام تسجيل الدخول.
ما هو Starter Kit؟
إذا كنت تبدأ مشروع Laravel جديدًا، فلست مضطرًا إلى بناء كل صفحات التسجيل وتسجيل الدخول يدويًا.
Laravel يوفر Starter Kits رسمية تساعدك على بدء مشروع يحتوي على بنية Authentication جاهزة.
توضح وثائق Laravel 13 أن Starter Kits توفر المسارات والـ Controllers والواجهات اللازمة لتسجيل المستخدمين ومصادقتهم، وتستخدم Laravel Fortify لمعالجة منطق Authentication.
وتتوفر في Laravel 13 Starter Kits رسمية تعتمد على تقنيات مثل:
- React
- Vue
- Svelte
- Livewire
ويمكن اختيار Starter Kit عند إنشاء تطبيق جديد باستخدام Laravel Installer.
لماذا نستخدم Starter Kit؟
بدل أن تبدأ من الصفر وتبني:
Register Login Logout Forgot Password Reset Password Email Verification 2FA
يمكنك استخدام Starter Kit يوفر جزءًا كبيرًا من هذه البنية.
وهذا لا يعني أنك لا تحتاج إلى فهم Authentication.
بالعكس.
من المهم جدًا أن تعرف ما الذي يحدث خلف هذه الواجهات.
Laravel نفسه يشير إلى أن Starter Kits مفيدة ليس فقط لتسريع البداية، بل أيضًا كطريقة لدراسة كيفية تطبيق Authentication داخل مشروع حقيقي.
إنشاء مشروع باستخدام Starter Kit
عند إنشاء تطبيق Laravel جديد باستخدام Laravel Installer:
laravel new my-app
يمكن للمثبت أن يطلب منك اختيار Starter Kit.
بعد إنشاء المشروع يمكنك تثبيت اعتماديات الواجهة وتشغيل التطبيق:
cd my-app npm install && npm run build composer run dev
ثم يمكنك فتح التطبيق في المتصفح.
توثيق Laravel 13 يوضح أن Starter Kits يمكن اختيارها أثناء إنشاء التطبيق، وبعد ذلك يتم تشغيل اعتماديات الواجهة والتطبيق بالطريقة المعتادة.
صفحات Authentication
عند استخدام Starter Kit مناسب، ستحصل على صفحات Authentication مثل:
/register /login /forgot-password /reset-password
وقد توجد أيضًا مسارات خاصة بالتحقق من البريد الإلكتروني وتسجيل الخروج وغيرها حسب الميزات المفعلة.
فكرة هذه الصفحات هي:
/register
↓
إنشاء User
/login
↓
Authentication
/dashboard
↓
صفحة محمية
/logout
↓
إنهاء Session
إنشاء حساب جديد
عملية التسجيل تعني إنشاء User جديد في قاعدة البيانات.
عادةً يحتاج النموذج إلى:
Name Email Password Password Confirmation
ثم يتم التحقق من البيانات.
مثلًا:
'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'confirmed'],
لاحظ أننا استخدمنا قواعد Validation التي تعلمناها في الدرس السابع.
وهنا يظهر الترابط بين الدروس:
Form ↓ Request ↓ Validation ↓ User Model ↓ Database
لماذا لا نخزن كلمة المرور كنص عادي؟
هذه نقطة أمنية مهمة جدًا.
لا يجب تخزين كلمة المرور بهذه الطريقة:
password123
داخل قاعدة البيانات.
بدلًا من ذلك، يجب تخزين قيمة Hash.
Laravel يوفر أدوات مخصصة لتشفير كلمات المرور باستخدام Hashing.
مثلًا:
use Illuminate\Support\Facades\Hash;
$hashedPassword = Hash::make('password123');
ثم يمكن تخزين القيمة الناتجة في قاعدة البيانات.
وعند تسجيل الدخول، لا نقارن كلمة المرور النصية مباشرة بالقيمة المخزنة، بل يستخدم Laravel آلية التحقق من الـ Hash.
Laravel يوضح أن الخوارزمية الافتراضية لكلمات المرور هي bcrypt، كما يدعم إعادة Hashing تلقائيًا عند الحاجة أثناء تسجيل الدخول.
تسجيل الدخول Login
تسجيل الدخول يعني إرسال بيانات المستخدم إلى Laravel للتحقق منها.
يمكن تنفيذ Authentication يدويًا باستخدام Auth Facade.
مثلًا:
use Illuminate\Support\Facades\Auth;
if (Auth::attempt([
'email' => $request->email,
'password' => $request->password,
])) {
// Login successful
}
إذا كانت البيانات صحيحة، يتم تسجيل المستخدم.
أما إذا كانت غير صحيحة، يمكنك إعادة المستخدم إلى صفحة تسجيل الدخول مع رسالة خطأ.
لماذا نستخدم Auth::attempt()؟
الدالة:
Auth::attempt()
مخصصة لمحاولة تسجيل الدخول باستخدام بيانات الاعتماد التي تقدمها.
يمكن أن تحتوي على:
[
'email' => $request->email,
'password' => $request->password,
]
Laravel يبحث عن المستخدم بناءً على البيانات المناسبة ويتحقق من كلمة المرور.
إذا نجحت العملية:
Auth::attempt(...)
تعيد:
true
وإذا فشلت:
false
توثيق Laravel يوضح أن attempt() تستخدم عادةً لمعالجة بيانات نموذج تسجيل الدخول، ويوصي بإعادة توليد Session بعد نجاح المصادقة للحماية من Session Fixation.
إعادة توليد Session بعد تسجيل الدخول
بعد نجاح تسجيل الدخول، من الممارسات المهمة إعادة توليد Session:
$request->session()->regenerate();
مثلًا:
if (Auth::attempt([
'email' => $request->email,
'password' => $request->password,
])) {
$request->session()->regenerate();
return redirect()->intended('/dashboard');
}
الفكرة هنا أن Laravel يحافظ على Session آمنة بعد نجاح تسجيل الدخول.
ما معنى redirect()->intended()؟
عندما يحاول مستخدم غير مسجل الدخول الوصول إلى صفحة محمية، يمكن أن يعيد Laravel المستخدم إلى صفحة تسجيل الدخول.
بعد نجاح تسجيل الدخول، يمكن استخدام:
redirect()->intended('/dashboard')
بحيث يتم توجيه المستخدم إلى الصفحة التي كان يريد الوصول إليها، وإذا لم توجد صفحة سابقة محددة يتم استخدام /dashboard كوجهة افتراضية.
وهذه تجربة أفضل للمستخدم من إرساله دائمًا إلى نفس الصفحة.
كيف نعرف أن المستخدم مسجل الدخول؟
يمكننا استخدام:
Auth::check()
مثلًا:
use Illuminate\Support\Facades\Auth;
if (Auth::check()) {
// المستخدم مسجل الدخول
}
إذا كان المستخدم مسجلًا:
true
وإذا لم يكن:
false
Laravel يوثق Auth::check() كطريقة للتحقق مما إذا كان المستخدم الحالي مصادقًا عليه.
الحصول على المستخدم الحالي
إذا أردت الحصول على بيانات المستخدم الذي قام بتسجيل الدخول:
$user = Auth::user();
ثم يمكنك:
echo $user->name;
أو:
echo $user->email;
مثلًا:
if (Auth::check()) {
$user = Auth::user();
return $user->name;
}
استخدام auth() Helper
يمكنك أيضًا استخدام:
auth()->user()
بدل:
Auth::user()
مثلًا:
$user = auth()->user();
والتحقق:
if (auth()->check()) {
// User is authenticated
}
هذه الطريقة شائعة جدًا في Laravel.
حماية Routes باستخدام auth Middleware
تخيل أن لديك صفحة Dashboard:
Route::get('/dashboard', function () {
return view('dashboard');
});
في هذه الحالة يمكن لأي شخص الوصول إليها.
إذا أردت السماح للمستخدمين المسجلين فقط، يمكنك استخدام:
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware('auth');
الآن أصبح Route محميًا.
Laravel يوفر Middleware باسم auth للتحقق من أن المستخدم مسجل الدخول قبل السماح له بالوصول إلى المسار.
حماية مجموعة من Routes
إذا كان لديك أكثر من صفحة تحتاج إلى تسجيل الدخول:
/dashboard /profile /settings /articles/create /articles/edit
يمكنك استخدام Route Group:
Route::middleware('auth')->group(function () {
Route::get('/dashboard', function () {
return view('dashboard');
});
Route::get('/profile', function () {
return view('profile');
});
Route::get('/settings', function () {
return view('settings');
});
});
بهذه الطريقة يتم تطبيق auth Middleware على جميع Routes داخل المجموعة.
Authentication مع Controllers
في التطبيقات الحقيقية غالبًا لن تضع منطق التطبيق كله داخل Route Closure.
يمكنك استخدام Controller:
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware('auth');
ثم:
class DashboardController extends Controller
{
public function index()
{
$user = auth()->user();
return view('dashboard', compact('user'));
}
}
وهنا نستخدم المفاهيم التي تعلمناها في الدرس الخامس:
Route ↓ Controller ↓ Auth ↓ View
عرض اسم المستخدم في Blade
بعد إرسال المستخدم إلى View:
return view('dashboard', compact('user'));
يمكننا في Blade كتابة:
<h1>مرحبًا {{ $user->name }}</h1>
ويمكننا أيضًا استخدام Auth مباشرة في Blade حسب الحاجة.
مثلًا:
@if (auth()->check())
<p>مرحبًا {{ auth()->user()->name }}</p>
@endif
عرض محتوى مختلف للمستخدم والزائر
يمكنك إنشاء واجهة تختلف حسب حالة Authentication:
@if (auth()->check())
<p>مرحبًا {{ auth()->user()->name }}</p>
<a href="/dashboard">لوحة التحكم</a>
@else
<a href="/login">تسجيل الدخول</a>
<a href="/register">إنشاء حساب</a>
@endif
وهنا نستخدم ما تعلمناه في الدرس السادس عن Blade وViews.
تسجيل الخروج Logout
عندما يريد المستخدم إنهاء الجلسة، يمكن استخدام:
Auth::logout();
لكن من الأفضل أيضًا إبطال Session وتجديد CSRF Token:
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
وبذلك تنتهي جلسة المستخدم الحالية.
Laravel يوفر توثيقًا مباشرًا لعملية تسجيل الخروج وإبطال الجلسة.
لماذا لا نستخدم GET لتسجيل الخروج؟
من الأفضل أن تكون العمليات التي تغير حالة التطبيق مبنية على HTTP method مناسب.
لذلك عادةً يكون Logout عبر:
POST /logout
وليس رابطًا عاديًا من نوع:
GET /logout
وهذا يتناسب مع طريقة عمل Starter Kits الرسمية، حيث يوفر Fortify مسار Logout باستخدام POST.
نموذج Logout في Blade
إذا كان Route الخاص بالخروج يتطلب POST، يمكن استخدام Form:
<form method="POST" action="/logout">
@csrf
<button type="submit">
تسجيل الخروج
</button>
</form>
لاحظ وجود:
@csrf
وهذا المفهوم تعلمناه في درس Requests وValidation.
مرة أخرى نرى كيف ترتبط دروس Laravel ببعضها.
Authentication وCSRF
عند إنشاء Form يستخدم:
POST PUT PATCH DELETE
يجب الانتباه إلى CSRF Protection في تطبيقات الويب.
لذلك نستخدم:
@csrf
داخل النموذج.
مثلًا:
<form method="POST" action="/login">
@csrf
<input type="email" name="email">
<input type="password" name="password">
<button type="submit">
تسجيل الدخول
</button>
</form>
Login Controller يدوي بسيط
إذا أردت فهم ما يحدث خلف Starter Kit، يمكننا تصور Controller بسيط:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
public function login(Request $request)
{
$credentials = $request->validate([
'email' => ['required', 'email'],
'password' => ['required'],
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('/dashboard');
}
return back()->withErrors([
'email' => 'بيانات تسجيل الدخول غير صحيحة.',
])->onlyInput('email');
}
}
لاحظ أننا جمعنا عدة مفاهيم تعلمناها في الدروس السابقة:
Request ↓ Validation ↓ Auth::attempt() ↓ Session ↓ Redirect
Login Route
يمكن أن يكون لدينا:
Route::post('/login', [LoginController::class, 'login'])
->name('login');
أما صفحة تسجيل الدخول:
Route::get('/login', function () {
return view('auth.login');
})->middleware('guest');
ما هو guest Middleware؟
كما يوجد:
auth
لحماية الصفحات من الزوار، يوجد أيضًا:
guest
ويُستخدم عادةً للصفحات التي يفترض أن يصل إليها الزائر غير المسجل فقط.
مثل:
Route::get('/login', function () {
return view('auth.login');
})->middleware('guest');
إذا كان المستخدم مسجل الدخول بالفعل، فلا حاجة لإظهار صفحة Login له.
الفرق بين auth وguest
يمكن تبسيط الأمر:
auth ↓ السماح للمستخدم المسجل فقط
بينما:
guest ↓ السماح للزائر غير المسجل
مثلًا:
/dashboard → auth /login → guest /register → guest
Login Throttling
من المشاكل الأمنية التي يجب الانتباه إليها محاولات تسجيل الدخول المتكررة.
تخيل شخصًا يحاول آلاف كلمات المرور على نفس الحساب.
هذه العملية تسمى عادةً Brute Force Attack.
Laravel Starter Kits توفر Rate Limiting لمحاولات تسجيل الدخول، ويمكن تخصيص آلية تحديد معدل المحاولات. وتوضح وثائق Laravel 13 أن Starter Kits تطبق throttling لمحاولات تسجيل الدخول، مع إمكانية تخصيص Rate Limiting.
وهذا يوضح أهمية عدم بناء نظام Login بطريقة عشوائية دون الاهتمام بالحماية.
Email Verification
في بعض التطبيقات لا يكفي أن ينشئ المستخدم حسابًا.
قد ترغب في التأكد من أن البريد الإلكتروني الذي أدخله المستخدم يخصه فعلًا.
هنا يأتي مفهوم:
Email Verification
أي إرسال رسالة إلى البريد الإلكتروني تحتوي على رابط لتأكيد البريد.
Starter Kits الرسمية تدعم Email Verification ضمن ميزات Authentication.
Password Reset
ماذا يحدث إذا نسي المستخدم كلمة المرور؟
لا يجب أن تطلب منه إرسال كلمة المرور القديمة.
بدلًا من ذلك، يوفر Laravel آلية لإعادة تعيين كلمة المرور.
عادةً تبدأ العملية من:
Forgot Password
ثم:
Email ↓ Reset Link ↓ New Password
Starter Kits توفر صفحات ومسارات خاصة باستعادة وإعادة تعيين كلمة المرور.
Two-Factor Authentication
في التطبيقات التي تحتاج مستوى أعلى من الأمان، يمكن استخدام Two-Factor Authentication – 2FA.
الفكرة أن كلمة المرور وحدها لا تكفي.
بعد إدخال كلمة المرور، يحتاج المستخدم إلى رمز إضافي يتم توليده بواسطة تطبيق Authenticator متوافق.
Starter Kits الحديثة في Laravel توفر دعمًا لـ 2FA ويمكن تفعيلها حسب إعدادات التطبيق.
أين توجد إعدادات Authentication؟
من الملفات المهمة:
config/auth.php
يحتوي هذا الملف على إعدادات Guards وProviders وغيرها من إعدادات Authentication.
لكن كمبتدئ، لا تحتاج إلى تغيير كل شيء فيه.
من الأفضل أولًا فهم النظام الافتراضي، ثم تعديل الإعدادات عندما تحتاج إلى ذلك.
Laravel يوضح أن config/auth.php هو ملف إعداد Authentication الرئيسي للتطبيق.
دورة تسجيل الدخول كاملة
لنلخص العملية التي تحدث عندما يسجل المستخدم الدخول:
المستخدم
↓
يفتح /login
↓
Login Form
↓
يدخل Email + Password
↓
POST /login
↓
Validation
↓
Auth::attempt()
↓
التحقق من User
↓
التحقق من Password Hash
↓
Session
↓
المستخدم أصبح Authenticated
↓
redirect('/dashboard')
وبعد ذلك عندما يزور المستخدم:
/dashboard
يعمل:
auth Middleware
ويتحقق من أن المستخدم مصادق عليه.
إذا كان مسجلًا:
Allow
وإذا لم يكن:
Redirect to Login
مثال عملي كامل
لنفترض أننا نريد بناء منطقة خاصة للمستخدمين.
لدينا:
/login /register /dashboard /profile /logout
يمكن تصور Routes بالشكل التالي:
Route::middleware('guest')->group(function () {
Route::get('/login', [LoginController::class, 'show'])
->name('login');
Route::post('/login', [LoginController::class, 'login']);
Route::get('/register', [RegisterController::class, 'show'])
->name('register');
Route::post('/register', [RegisterController::class, 'register']);
});
Route::middleware('auth')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])
->name('dashboard');
Route::get('/profile', [ProfileController::class, 'index'])
->name('profile');
Route::post('/logout', [LoginController::class, 'logout'])
->name('logout');
});
الفكرة الأساسية هنا:
Guest ↓ Login / Register Authenticated User ↓ Dashboard / Profile / Logout
ربط Authentication بالدرس السابق
في الدرس الحادي عشر تعلمنا Factories وSeeders.
يمكننا الآن استخدامها لإنشاء مستخدم تجريبي:
User::factory()->create([
'name' => 'Ahmed',
'email' => 'ahmed@example.com',
]);
وبذلك نستطيع استخدام هذا المستخدم أثناء اختبار Authentication.
وهكذا أصبح لدينا:
Factory ↓ User ↓ Database ↓ Login ↓ Authentication
أخطاء شائعة
وضع كلمة المرور كنص عادي
خطأ:
'password' => '123456'
عند إنشاء مستخدم بشكل يدوي دون Hash.
استخدم:
'password' => Hash::make('123456')
أو اعتمد على الآلية التي يوفرها Starter Kit لإنشاء المستخدمين.
نسيان auth Middleware
إذا كان لديك:
Route::get('/dashboard', ...);
فهذا لا يعني تلقائيًا أن الصفحة محمية.
يجب حماية المسار:
Route::get('/dashboard', ...)
->middleware('auth');
نسيان regenerate بعد Login
بعد نجاح:
Auth::attempt()
يجب التعامل مع Session بالشكل الصحيح، ومن الممارسات التي توثقها Laravel إعادة توليد Session بعد نجاح تسجيل الدخول.
استخدام GET لتسجيل الخروج
لا تجعل:
GET /logout
هو الوسيلة الأساسية لتسجيل الخروج.
استخدم POST مع CSRF Protection.
الخلط بين Authentication وAuthorization
تذكر:
Authentication = من أنت؟
بينما:
Authorization = ماذا يسمح لك أن تفعل؟
وهما مفهومان مختلفان.
أفضل الممارسات
استخدم Starter Kits عندما تناسب مشروعك
إذا كنت تبدأ مشروعًا جديدًا وتحتاج إلى Authentication كامل، فإن Starter Kits الرسمية يمكن أن توفر لك أساسًا جاهزًا وقابلًا للتخصيص.
لا تخزن كلمات المرور كنص عادي
استخدم Hashing المناسب.
احمِ المسارات الحساسة
استخدم:
->middleware('auth')
استخدم Validation
لا تقبل بيانات Login أو Registration دون التحقق منها.
اهتم بالـ Rate Limiting
خصوصًا في عمليات تسجيل الدخول.
افصل Authentication عن Authorization
تسجيل الدخول ليس هو نفسه نظام الصلاحيات.
تمرين عملي
الآن جاء دورك.
أنشئ تطبيقًا بسيطًا يحتوي على:
Register Login Dashboard Profile Logout
ثم حاول تنفيذ الآتي:
الخطوة الأولى
أنشئ مستخدمًا تجريبيًا باستخدام Factory.
الخطوة الثانية
أنشئ صفحة Login.
الخطوة الثالثة
أضف Form يحتوي على:
Email Password
الخطوة الرابعة
استخدم Validation:
$request->validate([
'email' => ['required', 'email'],
'password' => ['required'],
]);
الخطوة الخامسة
استخدم:
Auth::attempt()
للتحقق من بيانات المستخدم.
الخطوة السادسة
بعد نجاح تسجيل الدخول استخدم:
$request->session()->regenerate();
الخطوة السابعة
أنشئ Dashboard محمية:
Route::get('/dashboard', ...)
->middleware('auth');
الخطوة الثامنة
اعرض اسم المستخدم:
{{ auth()->user()->name }}
الخطوة التاسعة
أنشئ Logout باستخدام POST.
الخطوة العاشرة
اختبر السيناريو التالي:
زائر ↓ يحاول فتح Dashboard ↓ يذهب إلى Login ↓ يسجل الدخول ↓ يعود إلى Dashboard ↓ يشاهد اسمه ↓ يضغط Logout ↓ يصبح Guest
إذا استطعت تنفيذ هذا السيناريو، فقد فهمت الأساس الحقيقي لنظام Authentication في Laravel.
ماذا تعلمنا في هذا الدرس؟
في هذا الدرس تعرفنا على مفهوم Authentication وكيف يستخدم Laravel للتحقق من هوية المستخدم.
تعلمنا الفرق بين:
Authentication
و:
Authorization
وتعرفنا على:
- User Model.
- Guards.
- Providers.
- Sessions.
- Auth Facade.
Auth::check().Auth::user().Auth::attempt().auth()->user().authMiddleware.guestMiddleware.- تسجيل الدخول.
- تسجيل الخروج.
- Session Regeneration.
- Password Hashing.
- Email Verification.
- Password Reset.
- Login Throttling.
- Starter Kits.
كما رأينا كيف تتصل هذه المفاهيم بما تعلمناه سابقًا:
Blade ↓ Form ↓ Request ↓ Validation ↓ Auth ↓ Session ↓ Middleware ↓ Controller ↓ User Model ↓ Database
وهذه السلسلة تمثل جزءًا أساسيًا جدًا من تطبيقات Laravel الحديثة.
Authentication هو أحد أهم الأجزاء في أي تطبيق يحتوي على مستخدمين.
لم يعد المستخدم بالنسبة لنا مجرد سجل موجود داخل جدول users.
أصبح لدينا الآن مفهوم كامل لإدارة المستخدم:
Register ↓ User ↓ Login ↓ Authentication ↓ Session ↓ Protected Routes ↓ Dashboard ↓ Logout
وتعلمنا أن Laravel يوفر أدوات جاهزة للتعامل مع هذه العمليات، كما يوفر Starter Kits رسمية تساعد على بناء طبقة Authentication متكاملة بدل كتابة كل شيء من الصفر.
في الدرس القادم سننتقل إلى خطوة مهمة جدًا بعد Authentication، وهي Authorization والصلاحيات والأدوار Roles & Permissions، لنتعلم كيف نفرق بين المستخدم العادي والمدير، وكيف نسمح لكل مستخدم بتنفيذ العمليات المناسبة له فقط.
