سی ام اس نویسسی ام اس نویسیاد بگیر، سیستم خودتو بنویس
مجلهتماس با ما
سی ام اس نویسسی ام اس نویس

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

پیوندهای سریع
محصولات فیزیکیمحصولات دیجیتالدوره‌های آموزشی
سی ام اس نویس
مجله سی ام اس نویستماس با ماپنل کاربری
سی ام اس نویس — تمامی حقوق برای سی ام اس نویس محفوظ است. © 1406 تماس با ما09307711941
آموزش ساخت سیستم احراز هویت در Laravel؛ ثبت‌نام، ورود و خروج کاربران

آموزش ساخت سیستم احراز هویت در Laravel؛ ثبت‌نام، ورود و خروج کاربران

ممدیر کل سیستم ۲۴ مهر ۱۴۰۵ ۲۳ دقیقه مطالعه ۱ بازدید
آموزش ساخت سیستم احراز هویت در Laravel؛ ثبت‌نام، ورود و خروج کاربران

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

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

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

سیستم احراز هویت در Laravel چیست؟

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

احراز هویت با مجوزدهی یا Authorization تفاوت دارد:

  • Authentication: مشخص می‌کند کاربر چه کسی است.
  • Authorization: مشخص می‌کند کاربر اجازه انجام چه کاری را دارد.

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

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

در این آموزش چه سیستمی می‌سازیم؟

در پایان پروژه، قابلیت‌های زیر را خواهیم داشت:

  • ثبت‌نام کاربران جدید
  • اعتبارسنجی ایمیل و رمز عبور
  • جلوگیری از ثبت‌نام با ایمیل تکراری
  • ذخیره امن رمز عبور به‌صورت هش‌شده
  • ورود کاربران با ایمیل و رمز عبور
  • امکان انتخاب گزینه مرا به خاطر بسپار
  • خروج امن از حساب کاربری
  • محافظت از داشبورد با Middleware احراز هویت
  • جلوگیری از دسترسی کاربران واردشده به صفحات ورود و ثبت‌نام
  • مدیریت خطاهای فرم‌ها

این پروژه یک پیاده‌سازی آموزشی برای احراز هویت مبتنی بر Session است. قابلیت‌هایی مانند بازیابی رمز عبور، تأیید ایمیل، ورود دومرحله‌ای و احراز هویت API را می‌توان در مراحل بعدی به آن اضافه کرد.

پیش‌نیازهای ساخت سیستم احراز هویت

برای دنبال کردن این آموزش بهتر است با موارد زیر آشنا باشید:

  • ساخت Route در Laravel
  • ایجاد Controller
  • کار با قالب‌های Blade
  • Migration و مدل‌های Eloquent
  • اعتبارسنجی فرم‌ها
  • کار با Session در لاراول

همچنین باید یک پروژه Laravel داشته باشید و اتصال دیتابیس آن را در فایل .env تنظیم کرده باشید.

نکته مهم: در این مقاله، احراز هویت را برای یادگیری سازوکار داخلی Laravel به‌صورت دستی پیاده‌سازی می‌کنیم. در پروژه‌های واقعی، Starter Kitهای رسمی Laravel نیز گزینه مناسبی هستند؛ زیرا امکاناتی مانند ثبت‌نام، ورود و بازیابی رمز عبور را با ساختار آماده در اختیار شما قرار می‌دهند.

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

Laravel در پروژه‌های استاندارد، معمولاً Migration مربوط به جدول users را در اختیار شما قرار می‌دهد. این جدول اطلاعات اصلی کاربران را ذخیره می‌کند.

برای بررسی Migrationها، به مسیر زیر بروید:

database/migrations/

فایلی با نامی مشابه نمونه زیر پیدا خواهید کرد:

0001_01_01_000000_create_users_table.php

نام دقیق فایل ممکن است با توجه به نسخه Laravel متفاوت باشد.

در Migration پیش‌فرض، ستون‌هایی مانند موارد زیر وجود دارند:

ستونکاربرد
idشناسه یکتای کاربر
nameنام کاربر
emailایمیل کاربر
email_verified_atزمان تأیید ایمیل
passwordرمز عبور هش‌شده
remember_tokenتوکن مربوط به قابلیت مرا به خاطر بسپار
created_atزمان ایجاد حساب
updated_atزمان آخرین به‌روزرسانی

اگر جدول کاربران هنوز در دیتابیس ایجاد نشده است، ابتدا اتصال دیتابیس را در فایل .env بررسی کنید و سپس دستور زیر را اجرا کنید:


php artisan migrate

این دستور Migrationهای اجرا‌نشده را اجرا می‌کند.

اگر جدول users از قبل وجود دارد و Migration آن اجرا شده است، نیازی نیست آن را دوباره ایجاد کنید.

بررسی مدل User

مدل کاربران معمولاً در مسیر زیر قرار دارد:

app/Models/User.php

برای اینکه بتوانیم هنگام ثبت‌نام، اطلاعات کاربر را با استفاده از متد create ذخیره کنیم، باید فیلدهای مجاز برای Mass Assignment را در مدل مشخص کنیم.

محتوای بخش مربوط به $fillable می‌تواند به شکل زیر باشد:


protected $fillable = [

    'name',

    'email',

    'password',

];

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

Laravel رمز عبور را به‌صورت خودکار در زمان استفاده از متد create هش نمی‌کند؛ بنابراین باید این کار را در کد ثبت‌نام انجام دهیم.

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

برای اینکه منطق ثبت‌نام، ورود و خروج را از فایل Route جدا کنیم، یک کنترلر اختصاصی می‌سازیم.

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


php artisan make:controller AuthController

پس از اجرای دستور، فایل زیر ایجاد می‌شود:

app/Http/Controllers/AuthController.php

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

فایل را باز کنید و کد زیر را در آن قرار دهید:


<?php



namespace App\Http\Controllers;



use App\Models\User;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;

use Illuminate\Support\Facades\Hash;



class AuthController extends Controller

{

    /**

     * نمایش فرم ثبت‌نام

     */

    public function showRegister()

    {

        return view('auth.register');

    }



    /**

     * ثبت‌نام کاربر جدید

     */

    public function register(Request $request)

    {

        $validated = $request->validate([

            'name' => ['required', 'string', 'max:255'],

            'email' => [

                'required',

                'string',

                'email',

                'max:255',

                'unique:users,email',

            ],

            'password' => [

                'required',

                'string',

                'min:8',

                'confirmed',

            ],

        ]);



        $user = User::create([

            'name' => $validated['name'],

            'email' => $validated['email'],

            'password' => Hash::make($validated['password']),

        ]);



        Auth::login($user);



        $request->session()->regenerate();



        return redirect()->route('dashboard');

    }



    /**

     * نمایش فرم ورود

     */

    public function showLogin()

    {

        return view('auth.login');

    }



    /**

     * ورود کاربر

     */

    public function login(Request $request)

    {

        $credentials = $request->validate([

            'email' => ['required', 'email'],

            'password' => ['required', 'string'],

        ]);



        $remember = $request->boolean('remember');



        if (Auth::attempt($credentials, $remember)) {

            $request->session()->regenerate();



            return redirect()->intended(

                route('dashboard')

            );

        }



        return back()

            ->withErrors([

                'email' => 'ایمیل یا رمز عبور واردشده صحیح نیست.',

            ])

            ->onlyInput('email');

    }



    /**

     * خروج کاربر

     */

    public function logout(Request $request)

    {

        Auth::logout();



        $request->session()->invalidate();



        $request->session()->regenerateToken();



        return redirect()->route('login');

    }

}

در ادامه، بخش‌های مهم این کد را بررسی می‌کنیم.

متد showRegister

این متد فرم ثبت‌نام را نمایش می‌دهد:


public function showRegister()

{

    return view('auth.register');

}

بنابراین باید فایل register.blade.php را در مسیر resources/views/auth ایجاد کنیم.

متد register

این متد اطلاعات فرم ثبت‌نام را دریافت و اعتبارسنجی می‌کند.

برای مثال، قانون زیر:


'unique:users,email'

بررسی می‌کند که ایمیل واردشده قبلاً در ستون email جدول users ثبت نشده باشد.

قانون زیر نیز:


'confirmed'

باعث می‌شود Laravel مقدار فیلد password را با فیلد password_confirmation مقایسه کند.

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

برای ذخیره رمز عبور از دستور زیر استفاده کرده‌ایم:


Hash::make($validated['password'])

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

در پایان، کاربر با Auth::login($user) وارد حساب خود می‌شود. سپس نشست او را با regenerate() تازه‌سازی می‌کنیم تا از حملات Session Fixation جلوگیری شود.

متد login

این متد اطلاعات ورود را دریافت می‌کند:


$credentials = $request->validate([

    'email' => ['required', 'email'],

    'password' => ['required', 'string'],

]);

سپس اعتبار اطلاعات با متد زیر بررسی می‌شود:


Auth::attempt($credentials, $remember)

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

پس از ورود موفق، نشست دوباره تولید می‌شود:


$request->session()->regenerate();

متد redirect()->intended() کاربر را به مقصدی که پیش از ورود قصد دسترسی به آن را داشته هدایت می‌کند. اگر چنین مقصدی ثبت نشده باشد، به داشبورد می‌رود.

در صورت نامعتبر بودن اطلاعات، پیام خطا نمایش داده می‌شود؛ بدون اینکه مشخص کنیم ایمیل اشتباه است یا رمز عبور.

متد logout

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


Auth::logout();



$request->session()->invalidate();



$request->session()->regenerateToken();

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

استفاده از این روش برای خروج امن از حساب مبتنی بر Session اهمیت دارد.

مرحله سوم: تعریف مسیرهای احراز هویت

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

فایل زیر را باز کنید:

routes/web.php

کدهای زیر را اضافه کنید:


<?php



use Illuminate\Support\Facades\Route;

use App\Http\Controllers\AuthController;



Route::middleware('guest')->group(function () {

    Route::get('/register', [

        AuthController::class,

        'showRegister',

    ])->name('register');



    Route::post('/register', [

        AuthController::class,

        'register',

    ])->name('register.store');



    Route::get('/login', [

        AuthController::class,

        'showLogin',

    ])->name('login');



    Route::post('/login', [

        AuthController::class,

        'login',

    ])->name('login.store');

});



Route::middleware('auth')->group(function () {

    Route::get('/dashboard', function () {

        return view('dashboard');

    })->name('dashboard');



    Route::post('/logout', [

        AuthController::class,

        'logout',

    ])->name('logout');

});

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

چرا از Middleware استفاده می‌کنیم؟

در این مثال از دو Middleware داخلی Laravel استفاده کرده‌ایم.

Middleware با نام guest:

برای صفحاتی مانند ورود و ثبت‌نام است. کاربرانی که قبلاً وارد حساب خود شده‌اند، نباید دوباره این صفحات را مشاهده کنند.

Middleware با نام auth:

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

برای مثال، اگر فردی بدون ورود به حساب کاربری، آدرس /dashboard را باز کند، Laravel او را به صفحه ورود هدایت می‌کند.

این کار باعث می‌شود به‌جای بررسی وضعیت ورود در تک‌تک کنترلرها، محدودیت دسترسی را در سطح Route اعمال کنیم.

مرحله چهارم: ساخت فرم ثبت‌نام کاربران

اکنون باید رابط کاربری ثبت‌نام را ایجاد کنیم.

داخل مسیر زیر، پوشه‌ای با نام auth بسازید:

resources/views/auth

سپس فایل زیر را ایجاد کنید:

resources/views/auth/register.blade.php

کد زیر یک فرم ساده و قابل اجرا برای ثبت‌نام است:


<!DOCTYPE html>

<html lang="fa" dir="rtl">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">



    <title>ثبت‌نام کاربران</title>

</head>

<body>



    <h1>ایجاد حساب کاربری</h1>



    @if ($errors->any())

        <div>

            <ul>

                @foreach ($errors->all() as $error)

                    <li>{{ $error }}</li>

                @endforeach

            </ul>

        </div>

    @endif



    <form method="POST" action="{{ route('register.store') }}">

        @csrf



        <div>

            <label for="name">نام و نام خانوادگی</label>



            <input

                type="text"

                id="name"

                name="name"

                value="{{ old('name') }}"

                required

                maxlength="255"

                autocomplete="name"

            >

        </div>



        <div>

            <label for="email">ایمیل</label>



            <input

                type="email"

                id="email"

                name="email"

                value="{{ old('email') }}"

                required

                autocomplete="email"

            >

        </div>



        <div>

            <label for="password">رمز عبور</label>



            <input

                type="password"

                id="password"

                name="password"

                required

                minlength="8"

                autocomplete="new-password"

            >

        </div>



        <div>

            <label for="password_confirmation">

                تکرار رمز عبور

            </label>



            <input

                type="password"

                id="password_confirmation"

                name="password_confirmation"

                required

                minlength="8"

                autocomplete="new-password"

            >

        </div>



        <button type="submit">ثبت‌نام</button>

    </form>



    <p>

        قبلاً ثبت‌نام کرده‌اید؟

        <a href="{{ route('login') }}">وارد شوید</a>

    </p>



</body>

</html>

نکات مهم فرم ثبت‌نام

۱. استفاده از @csrf

در فرم‌های POST مبتنی بر Session در Laravel، باید توکن CSRF وجود داشته باشد. دستور @csrf یک فیلد مخفی حاوی توکن معتبر ایجاد می‌کند.

۲. استفاده از old()

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

۳. استفاده از password_confirmation

این نام دقیقاً با قانون confirmed که در کنترلر تعریف کرده‌ایم هماهنگ است. اگر نام فیلد تغییر کند، باید قانون اعتبارسنجی نیز متناسب با آن اصلاح شود.

۴. اعتبارسنجی سمت سرور

ویژگی‌هایی مانند required و minlength در HTML برای بهبود تجربه کاربری مفید هستند، اما کافی نیستند. اعتبارسنجی اصلی همچنان باید در Laravel انجام شود.

مرحله پنجم: ساخت فرم ورود کاربران

حالا فایل زیر را ایجاد کنید:

resources/views/auth/login.blade.php

کد فرم ورود:


<!DOCTYPE html>

<html lang="fa" dir="rtl">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">



    <title>ورود به حساب کاربری</title>

</head>

<body>



    <h1>ورود به حساب کاربری</h1>



    @if ($errors->any())

        <div>

            <ul>

                @foreach ($errors->all() as $error)

                    <li>{{ $error }}</li>

                @endforeach

            </ul>

        </div>

    @endif



    <form method="POST" action="{{ route('login.store') }}">

        @csrf



        <div>

            <label for="email">ایمیل</label>



            <input

                type="email"

                id="email"

                name="email"

                value="{{ old('email') }}"

                required

                autocomplete="username"

            >

        </div>



        <div>

            <label for="password">رمز عبور</label>



            <input

                type="password"

                id="password"

                name="password"

                required

                autocomplete="current-password"

            >

        </div>



        <div>

            <label>

                <input type="checkbox" name="remember" value="1">

                مرا به خاطر بسپار

            </label>

        </div>



        <button type="submit">ورود</button>

    </form>



    <p>

        حساب کاربری ندارید؟

        <a href="{{ route('register') }}">ثبت‌نام کنید</a>

    </p>



</body>

</html>

این فرم اطلاعات ورود را با متد POST به مسیر login.store ارسال می‌کند.

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

گزینه مرا به خاطر بسپار چگونه کار می‌کند؟

این گزینه با استفاده از remember_token و قابلیت داخلی احراز هویت Laravel عمل می‌کند.

هنگامی که کاربر گزینه مربوطه را فعال می‌کند، متد Auth::attempt() با آرگومان دوم true فراخوانی می‌شود.

برای مثال:


Auth::attempt($credentials, true);

Laravel از سازوکار داخلی خود برای حفظ ورود کاربر استفاده می‌کند. با این حال، در برنامه‌های حساس نباید قابلیت ماندگاری ورود را جایگزین سیاست‌های امنیتی مناسب کرد.

مرحله ششم: ساخت داشبورد کاربران

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

resources/views/dashboard.blade.php

محتوای فایل:


<!DOCTYPE html>

<html lang="fa" dir="rtl">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">



    <title>داشبورد کاربری</title>

</head>

<body>



    <h1>داشبورد کاربری</h1>



    <p>

        خوش آمدید،

        {{ auth()->user()->name }}

    </p>



    <p>

        ایمیل شما:

        {{ auth()->user()->email }}

    </p>



    <form method="POST" action="{{ route('logout') }}">

        @csrf



        <button type="submit">خروج از حساب کاربری</button>

    </form>



</body>

</html>

در این صفحه از دستور زیر استفاده کرده‌ایم:


auth()->user()

این دستور کاربر احراز هویت‌شده فعلی را برمی‌گرداند.

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

همچنین نام کاربر و ایمیل با استفاده از نمایش امن Blade، یعنی {{ ... }}، چاپ می‌شوند. این روش به‌صورت پیش‌فرض خروجی را Escape می‌کند و برای نمایش متن‌های معمولی مناسب است.

مرحله هفتم: اجرای پروژه و آزمایش سیستم احراز هویت

اکنون اجزای اصلی سیستم آماده هستند.

اگر پروژه را در محیط توسعه اجرا می‌کنید، دستور زیر را وارد کنید:


php artisan serve

سپس آدرس‌های زیر را در مرورگر باز کنید:

آدرسکاربرد
/registerثبت‌نام کاربر
/loginورود به حساب
/dashboardداشبورد محافظت‌شده
/logoutخروج از حساب با درخواست POST

برای بررسی درست کار کردن پروژه، مراحل زیر را انجام دهید:

  1. آدرس /register را باز کنید.
  2. نام، ایمیل و رمز عبور را وارد کنید.
  3. رمز عبور را در فیلد تأیید تکرار کنید.
  4. فرم را ارسال کنید و بررسی کنید که به داشبورد هدایت می‌شوید.
  5. روی خروج کلیک کنید.
  6. دوباره تلاش کنید داشبورد را باز کنید؛ باید به صفحه ورود هدایت شوید.
  7. با اطلاعات حسابی که ساخته‌اید وارد شوید.
  8. تلاش کنید با ایمیل تکراری ثبت‌نام کنید و نتیجه اعتبارسنجی را بررسی کنید.
  9. رمز عبور اشتباه را در فرم ورود وارد کنید و مطمئن شوید که ورود انجام نمی‌شود.

در صورت بروز خطا، ابتدا Routeها، نام فایل‌های Blade، تنظیمات دیتابیس و وضعیت Migrationها را بررسی کنید.

مرحله هشتم: مشاهده مسیرهای ثبت‌شده در Laravel

اگر می‌خواهید مطمئن شوید که تمام Routeها به‌درستی ثبت شده‌اند، دستور زیر را اجرا کنید:


php artisan route:list

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


php artisan route:list --path=login

همچنین برای مشاهده مسیرهای ثبت‌نام:


php artisan route:list --path=register

اگر مسیری نمایش داده نمی‌شود، فایل routes/web.php و نحوه تعریف Route را بررسی کنید.

در محیط توسعه، در صورت مشاهده تغییرات قدیمی یا مشکلات مرتبط با Cache مسیرها، می‌توانید Cache را پاک کنید:


php artisan route:clear

این دستور برای رفع همه خطاها نیست؛ تنها Cache مسیرها را پاک می‌کند.

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

پیاده‌سازی ورود و ثبت‌نام فقط به معنای ساخت چند فرم نیست. احراز هویت مستقیماً با امنیت حساب کاربران ارتباط دارد و باید اصول زیر را رعایت کنید.

۱. رمز عبور را به‌صورت متن ساده ذخیره نکنید

هیچ‌گاه رمز عبور خام را در دیتابیس ذخیره نکنید.

در Laravel از ابزارهایی مانند Hash::make() برای هش رمز عبور استفاده کنید. در زمان ورود نیز Auth::attempt() اطلاعات را با سازوکار احراز هویت Laravel بررسی می‌کند.

از هش ساده و سریع مانند MD5 برای ذخیره رمز عبور استفاده نکنید.

۲. برای فرم‌ها از CSRF Protection استفاده کنید

در فرم‌های مبتنی بر Session که درخواست POST ارسال می‌کنند، از @csrf استفاده کنید.

این کار به جلوگیری از جعل درخواست بین‌سایتی کمک می‌کند. برای مسیرهای احراز هویت، محافظت CSRF را بدون بررسی دقیق سازوکار جایگزین حذف یا غیرفعال نکنید.

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

بعد از ورود موفق، اجرای دستور زیر اهمیت دارد:


$request->session()->regenerate();

این کار به کاهش خطر Session Fixation کمک می‌کند.

هنگام خروج نیز نشست باید باطل شود و توکن CSRF جدید تولید شود.

۴. تلاش‌های ورود را محدود کنید

اگر مهاجم بتواند تعداد نامحدودی رمز عبور را امتحان کند، احتمال حمله Brute Force افزایش پیدا می‌کند.

در محیط عملیاتی، برای مسیر ورود محدودیت تعداد درخواست‌ها (Rate Limiting) تنظیم کنید. محدودیت باید متناسب با نیاز پروژه و شرایط استفاده کاربران باشد.

در صورت استفاده از Starter Kitهای رسمی، تنظیمات و قابلیت‌های محدودسازی ورود را نیز بررسی کنید.

۵. پیام خطای ورود را عمومی نگه دارید

بهتر است هنگام ورود ناموفق، پیام یکسانی برای ایمیل یا رمز عبور اشتباه نمایش دهید.

برای مثال:

«ایمیل یا رمز عبور واردشده صحیح نیست.»

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

۶. از HTTPS استفاده کنید

در محیط عملیاتی، صفحات ورود و تمام درخواست‌هایی که اطلاعات حساس را منتقل می‌کنند باید از HTTPS استفاده کنند.

همچنین Cookieهای Session باید با تنظیمات امن مناسب، از جمله Secure در ارتباط HTTPS و HttpOnly، پیکربندی شوند. تنظیمات SameSite نیز باید متناسب با معماری برنامه انتخاب شود.

۷. ثبت‌نام را به کاربران غیرمجاز محدود نکنید، اما دسترسی‌ها را کنترل کنید

در این پروژه همه کاربران جدید می‌توانند ثبت‌نام کنند؛ اما ثبت‌نام به‌تنهایی نباید به کاربر اجازه دسترسی به پنل مدیریت یا عملیات حساس را بدهد.

برای مدیریت نقش‌ها و مجوزها باید از سازوکار Authorization، Policy، Gate یا سیستم نقش و مجوز استفاده کنید.

۸. برای ثبت‌نام و ورود API از روش مناسب استفاده کنید

این پروژه بر اساس احراز هویت وب و Session طراحی شده است. اگر قرار است یک اپلیکیشن موبایل یا سرویس خارجی به API لاراول متصل شود، باید روش احراز هویت API را متناسب با معماری انتخاب کنید.

Laravel Sanctum یکی از گزینه‌های مناسب برای بسیاری از کاربردهای API Token و SPA است؛ اما شیوه پیکربندی آن با احراز هویت معمول مبتنی بر فرم تفاوت دارد.

مرحله دهم: مشکلات رایج هنگام ساخت سیستم احراز هویت

خطای 419 Page Expired

این خطا در فرم‌های مبتنی بر Session معمولاً می‌تواند به توکن CSRF، انقضای نشست یا مشکلات Cookie مرتبط باشد.

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

  • آیا فرم دارای @csrf است؟
  • آیا Cookieهای مرورگر به‌درستی ارسال می‌شوند؟
  • آیا نشست به دلیل گذشت زمان منقضی شده است؟
  • آیا تنظیمات دامنه و HTTPS با نحوه دسترسی به برنامه سازگار است؟

خطای Route [login] not defined

این خطا معمولاً زمانی رخ می‌دهد که Laravel بخواهد کاربر مهمان را به Route نام‌گذاری‌شده login هدایت کند، اما چنین Routeای وجود نداشته باشد.

در این پروژه، مسیر ورود را با نام زیر تعریف کرده‌ایم:


->name('login');

بنابراین نام Route باید با تنظیمات Middleware و نحوه مدیریت کاربران مهمان هماهنگ باشد.

خطای View [auth.login] not found

این خطا نشان می‌دهد Laravel فایل View موردنیاز را پیدا نمی‌کند.

مسیر فایل باید دقیقاً به شکل زیر باشد:

resources/views/auth/login.blade.php

نام پوشه، نام فایل و پسوند blade.php را بررسی کنید.

خطای مربوط به فیلد password_confirmation

اگر کاربر رمز عبور و تکرار آن را به شکل یکسان وارد کند اما اعتبارسنجی شکست بخورد، نام فیلدهای فرم و قانون confirmed را بررسی کنید.

در حالت پیش‌فرض، نام فیلد تأیید باید password_confirmation باشد.

ثبت نشدن کاربر در دیتابیس

اگر ثبت‌نام انجام نمی‌شود، موارد زیر را بررسی کنید:

  • تنظیمات اتصال دیتابیس در .env
  • اجرای Migration جدول users
  • وجود ستون‌های name، email و password
  • تنظیم صحیح $fillable در مدل User
  • متن خطای نمایش‌داده‌شده در فرم یا گزارش خطای Laravel

کاربر پس از ورود دوباره به صفحه Login هدایت می‌شود

در این حالت، باید تنظیمات Session، Cookie، دامنه، HTTPS و Middlewareهای پروژه بررسی شوند.

اگر برنامه پشت Reverse Proxy یا Load Balancer اجرا می‌شود، تنظیمات اعتماد به Proxy نیز ممکن است در تشخیص صحیح HTTPS مؤثر باشد.

مرحله یازدهم: تفاوت احراز هویت دستی با Starter Kitهای Laravel

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

اما برای پروژه‌های واقعی، همیشه لازم نیست تمام این بخش‌ها را از ابتدا بنویسید.

Starter Kitهای رسمی Laravel می‌توانند ساختار آماده‌ای برای صفحات ورود، ثبت‌نام، بازیابی رمز عبور و قابلیت‌های مرتبط فراهم کنند. این ابزارها از Laravel Fortify برای بخش اصلی منطق احراز هویت استفاده می‌کنند.

انتخاب روش مناسب به نیاز پروژه بستگی دارد:

روشکاربرد
پیاده‌سازی دستی با Authیادگیری سازوکار احراز هویت و نیازهای سفارشی
Starter Kit رسمیشروع سریع پروژه با امکانات آماده و قابل سفارشی‌سازی
Laravel Sanctumاحراز هویت مناسب برای بسیاری از APIها و SPAها
Laravel Passportپیاده‌سازی قابلیت‌های مبتنی بر OAuth2 در سناریوهای مناسب

توجه داشته باشید که این گزینه‌ها کاملاً جایگزین یکدیگر نیستند. برای مثال، Sanctum و Passport به نیازهای متفاوتی پاسخ می‌دهند و انتخاب آن‌ها باید بر اساس معماری برنامه انجام شود.

مرحله دوازدهم: چه قابلیت‌هایی را می‌توان به سیستم اضافه کرد؟

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

  • بازیابی رمز عبور از طریق ایمیل
  • تأیید آدرس ایمیل
  • ورود دومرحله‌ای (2FA)
  • ورود با شماره موبایل و کد یک‌بارمصرف
  • ورود با حساب گوگل یا سایر ارائه‌دهندگان هویت
  • مدیریت نشست‌های فعال
  • محدودسازی تلاش‌های ورود
  • ثبت رویدادهای امنیتی
  • تعریف نقش‌های کاربری
  • مدیریت مجوزهای دسترسی
  • اتصال سیستم احراز هویت به API
  • پیاده‌سازی احراز هویت اپلیکیشن موبایل

این امکانات را باید بر اساس نیاز واقعی پروژه و با در نظر گرفتن امنیت و تجربه کاربری پیاده‌سازی کرد.

پرسش‌های متداول درباره احراز هویت در Laravel

۱. آیا Laravel سیستم احراز هویت داخلی دارد؟

بله. Laravel ابزارهای داخلی برای مدیریت احراز هویت، بررسی اطلاعات ورود و مدیریت نشست‌ها دارد. برای ساخت رابط کاربری آماده نیز می‌توان از Starter Kitهای رسمی استفاده کرد.

۲. تفاوت Authentication و Authorization در Laravel چیست؟

Authentication هویت کاربر را بررسی می‌کند؛ Authorization مشخص می‌کند کاربر مجاز به انجام چه عملیاتی است. برای مثال، ورود کاربر احراز هویت است، اما اجازه حذف یک محصول به مجوزدهی مربوط می‌شود.

۳. چرا باید رمز عبور را با Hash::make() ذخیره کنیم؟

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

۴. Middleware auth چه کاربردی دارد؟

این Middleware دسترسی به مسیرهای محافظت‌شده را به کاربران احراز هویت‌شده محدود می‌کند. کاربران مهمان در حالت معمول به صفحه ورود هدایت می‌شوند.

۵. آیا این سیستم برای API هم مناسب است؟

کد این آموزش برای احراز هویت وب مبتنی بر Session طراحی شده است. برای API باید روش مناسب احراز هویت، مانند Laravel Sanctum یا در سناریوهای لازم Passport، بر اساس نوع کلاینت و نیاز امنیتی انتخاب شود.

۶. آیا می‌توان ورود با شماره موبایل را به این سیستم اضافه کرد؟

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

۷. آیا بعد از ورود، کاربر باید همیشه به داشبورد منتقل شود؟

خیر. در این آموزش از redirect()->intended() استفاده کرده‌ایم تا کاربر در صورت وجود مقصد قبلی به همان صفحه برگردد؛ در غیر این صورت به داشبورد هدایت می‌شود.

جمع‌بندی

در این آموزش یاد گرفتیم چگونه یک سیستم احراز هویت پایه در Laravel بسازیم و اجزای مختلف آن را به یکدیگر متصل کنیم.

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

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

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

منابع تکمیلی

  • مستندات رسمی احراز هویت Laravel: https://laravel.com/docs/authentication
  • مستندات رسمی Starter Kitهای Laravel: https://laravel.com/docs/starter-kits
  • مستندات رسمی Laravel Sanctum: https://laravel.com/docs/sanctum

نظرات (0)

نظرات پس از تأیید مدیر نمایش داده می‌شوند

هنوز نظری ثبت نشده است؛ اولین نفر باشید!

مقالات مرتبط

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

۲۴ دقیقه
ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

۲۲ دقیقه
ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

۲۲ دقیقه
مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

۲۲ دقیقه