recent
أخبار ساخنة

تسجيل الدخول والتسجيل وحماية المسارات Authentication في Laravel

تسجيل الدخول والتسجيل وحماية المسارات 12

تسجيل الدخول والتسجيل وحماية المسارات في 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().
  • auth Middleware.
  • guest Middleware.
  • تسجيل الدخول.
  • تسجيل الخروج.
  • 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، لنتعلم كيف نفرق بين المستخدم العادي والمدير، وكيف نسمح لكل مستخدم بتنفيذ العمليات المناسبة له فقط.

google-playkhamsatmostaqltradentX