فصل ۱۴-۱: آشنایی با احراز هویت (Authentication) در لاراول

16 فروردین 1396
درسنامه درس 22 از سری لاراول
Laravel-Main-authentication

همواره طراحی و پیاده‌سازی وب سایت هوشمند با قابلیت ورود و عضویت کاربران به عنوان چالشی مهم برای طراحان و برنامه‌نویسان مطرح می‌شود. به طور کلی به هرگونه ورود و عضویت کاربران، بررسی جلسه‌ها (Sessions)، بازیابی رمز عبور و سطح دسترسی‌های کاربران، احراز هویت کاربر یا Authentication و اجازه دسترسی یا Authorization گفته می‌شود. حال در ادامه به توضیح این مبحث بسیار مهم پرداخته و شمارا با تمام تکنیک‌ها و مهارت‌های لازم برای ساخت و طراحی سیستم و وب سایت هوشمند آشنا خواهیم کرد.

مقدمه

فریم‌ورک هوشمند و قدرتمند لاراول بر خلاف سایر فریم‌ورک‌ها ابزار بسیار مناسبی را برای احراز هویت در اختیار کاربران قرار می‌دهد که از ویژگی‌های اصلی آن می‌توان به قابل فهم بودن و انعطاف‌پذیری آن اشاره کرد. تنظیمات سیستم احزار هویت لاراول در مسیر Config/auth.php قرار گرفته است که به توضیح آن خواهیم پرداخت. قبل از ورود به هر مبحثی یک دید کلی از سیستم احراز هویت لاراول در اختیار شما قرار خواهیم داد:

در لاراول ۵.۲ به بعد یک ویژگی جدید و قدرتمند برای سیستم احراز هویت معرفی شد که تحت عنوان guards مورد استفاده قرار می‌گیرد. سیستم احراز هویت پیشفرض لاراول قبل از ورژن ۵.۲ بر اساس صفحات وب که شامل لایه‌های username و password بود تعریف می‌شد و بر اساس اطلاعاتی که در بستر post‌ به کنترلرهای موردنظر ارسال می‌شدند، احراز هویت انجام می‌شد و اگر کاربر اجازه دسترسی به صفحه موردنظر را داشت، وارد شده و اطلاعات آن به صورت خودکار درون یک جلسه (Session) ذخیره و در غیر این صورت به صفحه دلخواه ارجاع داده می‌شد. حال در نظر داشته باشید که شما می‌خواهید یک API‌ مشخص در همان اپلیکیشن ایجاد کرده و این API‌ از JSON Web Token‌ یا چیزی شبیه به آن که اطلاعاتی را درون جلسه (Session) ذخیره نمی‌کند، استفاده کند. در این حالت باید چندین درایور برای احراز هویت ایجاد می‌کردید که کار را بسیار دشوار می‌کرد. اما در لاراول ۵.۲ به بعد این مشکل با استفاده از معرفی گاردها (Guards) به ساده‌ترین شکل ممکن حل شد.

با استفاده از گارد‌ها می‌توان چندین درایور و راه‌انداز را اجرا کنید. برای مشاهده‌ی انواع درایورهایی که از احراز هویت استفاده می‌کنند می‌توانید به مسیر config/auth.php‌ بروید در این فایل شما دو نوع مجموعه‌ی گارد مشاهده می‌کنید: web که در برای احراز هویت معمولی در صفحات وب مورد استفاده قرار می‌گیرد و اطلاعات را درون جلسه (Session) ذخیره می‌کند و دیگری api که برای احراز هویت بر اساس API Token‌ها بدون ذخیره‌سازی اطلاعات داخل Session مورد استفاده قرار می‌گیرد. هر دو این گاردها به یک Provider یکسان متصل می‌شوند.

Auth Providers همواره قابل تغییر هستند و می‌توان آنها را شخصی‌سازی کرد. همه‌ی این Providerها تعریف می‌کنند که چگونه سیستم اطلاعات کاربران را ذخیره و بازیابی می‌کند. هر یک از آنها به عنوان نمونه‌ای از Illuminate\Contracts\Auth\UserProviders معرفی می‌شوند:

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],

دیتابیس

به صورت پیش‌فرض در پوشه App همواره یک مدل به نام User وجود دارد. این مدل به عنوان راه‌انداز یا درایور احراز هویت لاراول ایجاد می‌شود. هنگامیکه دیتابیس را Migrate کنیم، به صورت پیش‌فرض جداول users و password_resets در دیتابیس مپ و بارگذاری خواهد شد. همانطور که از نام جدول users‌ مشخص است، اطلاعات کاربران در آن ذخیره می‌شود و در جدول password_resets اطلاعات مربوط به بازیابی رمز عبور قرار می‌گیرد. این دو جدول برای احراز هویت باید حتما وجود داشته باشند.

نصب سریع احراز هویت

چندین کنترلر پیش‌فرض در مسیر App\Http\Controllers\Auth وجود دارند که با نصب لاراول به این مسیر اضافه خواهند شد. یکی از این کنترلر‌ها برای عضویت کاربران جدید است که RegisterController نام دارد و دیگری برای ورود کاربران مورد استفاده قرار می‌گیرد که LoginController می‌باشد، کنترلر دیگر با نام ForgetPasswordController برای ارسال لینک بازیابی رمز عبور به آدرس ایمیل مورد استفاده قرار گرفته و در نهایت کنترلر ResetPasswordController که شامل دستورهایی برای بازیابی رمز عبور است. هر یک از این کنترلرها بر اساس متدهای درون خودشان کارهای پردازشی را انجام می‌دهند. در بسیاری از کاربردها، نیازی به ویرایش این کنترلرها نیست.

مسیردهی (Routing)

لاراول همواره یک راه سریع برای چارچوب‌بندی تمام مسیرها و ویوها در اختیار شما می‌گذارد. بنابراین برای چارچوب‌بندی احراز هویت توسط لاراول باید دستور زیر را در Artisan تایپ کنید:

php artisan make:auth

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

ویو (Views)

پس از اعمال دستور php artisan make:auth تمام ویوهای مرتبط با احراز هویت ایجاد شده و درون مسیر resources/views/auth قرار می‌گیرد.

احراز هویت (Authenticating)

با انجام مراحل فوق احراز هویت در اپلیکیشن شما نصب شده و می‌توانید ثبت‌نام یا ورود کنید.

شخصی‌سازی مسیر اصلی

هنگامی‌که احراز هویت یک کاربر با موفقیت انجام و کاربر وارد وب سایت شما می‌شود به صورت خودکار به مسیر home/ انتقال داده خواهد شد. شما می‌توانید این مسیر را شخص‌سازی کنید، برای اینکار کافی‌ست متغییر redirectTo را در کنترلرهای LoginController، RegisterController و ResetPasswordController تغییر دهید:

protected $redirectTo = '/';

همچنین می‌توانید از متد redirectTo به جای متغییر redirectTo‌ برای تعیین مسیر پیش‌فرض خود استفاده کنید. توجه دارید که این متد به متغییر و صفت redirectTo برتری دارد:

protected function redirectTo()
{
    return '/path';
}

شخصی‌سازی نام کاربری

به صورت پیش‌فرض از email‌ برای تایید هویت کاربران استفاده می‌شود. اگر می‌خواهید این ورود را شخصی‌‌سازی کنید کافیست یک متد به نام username در کنترلر LoginController ایجاد کنید:

public function username()
{
    return 'username';
}

بازیابی کاربران تایید شده

برای دسترسی به کاربران تایید شده می‌توان از Auth Facade استفاده کرد:

use Illuminate\Support\Facades\Auth;

// بازیابی کاربری که وارد سایت شده است
$user = Auth::user();

// بازیابی ID کاربری که وارد سایت شده است
$id = Auth::id();

همچنین توجه داشته باشید که اگر یک کاربر با موفقیت وارد شود می‌توان به کاربر بر اساس نمونه‌ی Illuminate\Http\Request‌ دسترسی پیدا کرد. یعنی بر اساس Request Facade و متد ()user‌ می‌توان به کاربر وارد شده دسترسی پیدا کرد:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfileController extends Controller
{
    /**
     * Update the user's profile.
     *
     * @param  Request  $request
     * @return Response
     */
    public function update(Request $request)
    {
        // $request->user() returns an instance of the authenticated user...
    }
}

بررسی کردن کاربران وارد شده

برای بررسی کردن یک کاربری که هم اکنون وارد سایت شده است می‌توان از متد check با Auth Facade استفاده کرد. در صورتیکه کاربر هنوز Login کرده باشد عبارت true بازگردانده خواهد شد:

use Illuminate\Support\Facades\Auth;

if (Auth::check()) {
    // The user is logged in...
}

حفاظت مسیرها

با استفاده از Route Middleware یا میان‌افزارهای مسیرها می‌توان به تنها به کاربرانی که وارد شده‌اند اجازه‌ی ورود به یک مسیر مشخص را داد. لاراول با استفاده از میان‌افزار auth که در مسیر Illuminate\Auth\Middleware\Authenticate تعریف شده است این اجازه را صادر می‌کند. برای اضافه کردن این میان‌افزار به مسیرهای خود باید همواره به صورت زیر عمل کنید:

Route::get('profile', function () {
    // Only authenticated users may enter...
})->middleware('auth');

همچنین می‌توان از کنترلرها به جای مسیرها برای اعمال محدودیت صفحات استفاده کرد. برای این کار می‌توان با فراخوانی متد middleware و پارامتر auth به صورت زیر متد سازنده را بازنویسی کرد:

public function __construct()
{
    $this->middleware('auth');
}

تعیین کردن یک گارد مشخص

هنگامیکه میان‌افزار auth را به مسیر خود اضافه می‌کنید، می‌توانید به صورت همزمان گارد موردنظر خود را نیز برای ورود کاربران و احراز هویت آنها بکار ببرید. این گارد بر اساس یکی از کلیدهای تعریف شده در guards موجود در مسیر config\auth.php انتخاب می‌شود:

public function __construct()
{
    $this->middleware('auth:api');
}

در مثال بالا از گارد api‌ که پیش‌تر توضیح آن را ارائه کردیم، استفاده شده است.

Throttle یا محدودیت برای ورود کاربران

Throttle چیست؟ به عنوان یک محدودیت زمانی به صفحات ورود اپلیکیشن‌ها اعمال می‌شود. حال اگر شما ۵ بار پسورد و یا یوزنیم را اشتباه وارد کنید اکانت شما به مدت ۱ دقیقه قفل شده و تا ۱ دقیقه توانایی وارد کردن اطلاعات را ندارید. این کار وب سایت شما را برای هکرها قدرتمندتر نشان می‌دهد. اگر شما از کلاس از پیش ساخته‌شده‌ی LoginController‌ لاراول استفاده می‌کنید، همواره کلاس Illuminate\Foundation\Auth\ThrottlesLogins به کنترلر شما اضافه شده است. برای تغییر دادن این مقادیر (دقیقه و تعداد دفعات وارد کردن اطلاعات) می‌توانید به مسیر vendor\laravel\framework\src\Illuminate\Foundation\Auth رفته و قایل ThrottlesLogins.php را باز کرده و مقادیر ۱ که به معنای ۱ دقیقه و ۵ که به معنای تعداد دفعات ۵ بار است را تغییر دهید.

 

تا به اینجای کار شما با مفاهیم بسیار مهم احراز هویت و انواع گاردها و همچنین چند متد ساده و ابتدایی برای چک کردن ورود کاربران و بازیابی اطلاعات کاربران وارد شده، آشنا شدید. در ادامه به توضیح Throttleها پرداخته و نحوه‌ی استفاده از آنها را شرح دادیم. در فصل ۱۴-۲ به ادامه‌ی مباحث احراز هویت می‌پردازیم.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری لاراول توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (3 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

محمد
01 مرداد 1400
این فقط برای جدول users هست برای سایر جداول باید چه کنیم؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

حسین
30 شهریور 1397
سلام و عرض خسته نباشید توضیحاتتون بسیار عالیه و امیداوارم که همینطور با قدرت پیش برین

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

رضا
20 تیر 1397
با سلام ممنون بابت آموزش های خوبتون یک مشکلی من با لاراول 5.5 دارم موقع استفاده از میدلویر برای لاگین صفحه لاگین رفرش میشود و به صفحه ادمین وارد نمیشود اما اگر میدلویر و حذف کنم لاگیم میشه .... کدش مثه کدی که شماتو آموزش گذاشتید استفاده می کنم: Route::get('profile', function () { // Only authenticated users may enter... })->middleware('auth'); من از احراز هویت دیفالت خود لاراول استفاده می کنم علت این مشکل چیه بنظرتون؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.