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

17 فروردین 1396
درسنامه درس 23 از سری لاراول
Laravel-Main-authentication-part2

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

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

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

همواره با استفاده از Auth Facade می‌توان به سرویس‌های authentication دسترسی پیدا کرد. بنابراین باید مطمئن باشیم که Auth Facade همواره به کنترلر ما اضافه شده باشد. پس از اضافه کردن عبارت use Illuminate\Support\Facades\Auth; به ابتدای کلاس کنترلر خود باید از متد attempt به صورت زیر استفاده کنید:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
    /**
     * Handle an authentication attempt.
     *
     * @return Response
     */
    public function authenticate()
    {
        if (Auth::attempt(['email' => $email, 'password' => $password])) {
            // Authentication passed...
            return redirect()->intended('dashboard');
        }
    }
}

این متد آرایه‌ای از کلید‌ها و مقادیر را به عنوان آرگومان اول می‌پذیرد. این مقادیر که درون آرایه وجود دارند بر اساس آنچه که برای یافتن کاربر در جدول users دیتابیس مورد استفاده قرار می‌گیرد، تنظیم می‌شوند. بنابراین در مثال بالا کاربر توسط مقدار ستون email بازیابی خواهد شد. سپس اگر کاربر پیدا شود، پسورد رمزنگاری‌شده موجود در دیتابیس نیز با password وارد شده توسط کاربر مطابقت داده خواهد شد. اگر هر دو پسورد یکسان باشند عمل احراز هویت برای این session و ورود کاربر انجام می‌شود.

اگر احراز هویت با موفقیت انجام شود متد attempt مقدار true را باز می‌گرداند. در غیر این صورت مقدار false بازگردانده خواهد شد.

همچنین متد intended در redirector کاربر را به یک URL‌ مشخص در صورت عدم تایید، هدایت می‌کند.

اضافه کردن شروط مختلف 

اگر نیاز دارید که شرطهای مختلفی به کوئری احراز هویت اضافه کنید می‌تواند آن را به عنوان آرگومان به آرایه‌ی موجود در متد ارسال نمایید:

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // The user is active, not suspended, and exists.
}

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

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

if (Auth::guard('admin')->attempt($credentials)) {
    //
}

خروج کاربران

برای خروج کاربران از نرم‌‎افزار تحت وب شما، همواره باید از متد logout در Auth Facade استفاده کرد. این متد اطلاعات هویتی هر کاربر را از Session حذف می‌کند:

Auth::logout();

به یاد آوردن کاربران

گاهی نیاز داریم که در فرم‌های ورود و عضویت خود یک گزینه به نام remember me یا «مرا به خاطر بسپار» اضافه کنیم. با استفاده از این گزینه کاربر هر وقت با session مشخص وارد شود به سرعت ورود به سایت کرده و نیازی به وارد کردن اطلاعات مجدد نیست. برای فعال‌کردن این قابلیت باید یک آرگومان دوم به متد attempt اضافه کرد. همچنین در نظر داشته باشید که جدول users نیز باید یک ستون رشته‌ای با عنوان remember_token داشته باشد تا رمز remember me برای هر کاربر را در خود ذخیره کند:

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // The user is being remembered...
}

توجه: در صورتیکه که از کلاس کنترلر LoginControllers.php استفاده می‌کنید نیازی به اضافه کردن آرگومان دوم نیست و به صورت پیش‌فرض این قابلیت به نرم‌افزار شما اضافه خواهد شد.

می‌توان با استفاده از متد viaRemember برای کاربرانی که روی گزینه «مرا به خاطر بسپار» کلیک کرده‌اند شرایطی را اعمال کرد:

if (Auth::viaRemember()) {
    //
}

متدهای دیگر احراز هویت

احراز هویت یک کاربر خاص

در صورتیکه نیاز دارید یک کاربر خاص را همواره درون سایت وارد کنید می‌توانید از متد login استفاده نمایید. همچنین باید مدل App\User وجود داشته باشد:

Auth::login($user);

// Login and "remember" the given user...
Auth::login($user, true);

همچنین می‌توان این متد را به همراه تعریف گاردها مورد استفاده قرار داد:

Auth::guard('admin')->login($user);

احراز هویت یک کاربر خاص با استفاده از ID

برای احراز هویت همیشگی یک کاربر با یک آی دی خاص باید از متد loginUsingId استفاده کرد این متد تنها کلید اصلی یک کاربر را برای تایید هویت آن دریافت می‌کند:

Auth::loginUsingId(1);

// Login and "remember" the given user...
Auth::loginUsingId(1, true);

احراز هویت یک کاربر تنها یک‌بار

گاهی نیاز است تا کاربران تنها برای یک درخواست مشخص احزار هویت آنها صورت بگیرد. برای اینکار از متد once استفاده خواهیم کرد. هیچ Session یا Cookie استفاده نمی‌شود، این متد هنگامیکه برای ساخت یک API‌ بدون ذخیره‌سازی Session بسیار کاربردی است:

if (Auth::once($credentials)) {
    //
}

احراز هویت پایه‌ای HTTP

با استفاده از Provider احراز هویت HTTP Basic به راحتی هرچه ممکن می‌توانید احراز هویت کاربران را بدون نصب و راه اندازی صفحه Login انجام دهید. برای شروع ابتدا میان‌افزار auth:basic را به مسیر خود اضافه کنید. میان‌افزار auth:basic درون فریم‌ورک لاراول به صورت خودکار وجود دارد و برای تعریف آن باید به صورت زیر عمل کنید:

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

هنگامیکه میان‌افزار به مسیر اضافه می‌شود، به صورت خودکار احراز هویت روی کاربر بر اساس ستون email صورت گرفته و اجازه ورود به کاربر داده خواهد شد.

اضافه کردن یک گارد شخصی

گاهی اوقات ممکن است شما بخواهید یک گارد شخصی و دلخواه برای خود ایجاد کرده و آن را در احراز هویت کاربران مورد استفاده قرار دهید. برای این کار باید از متد extend در Auth Facade بهره برده و سپس آن را برای فراخوانی یک provider درون Service Provider، جای دهید.

<?php

namespace App\Providers;

use App\Services\Auth\JwtGuard;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Auth::extend('jwt', function ($app, $name, array $config) {
            // Return an instance of Illuminate\Contracts\Auth\Guard...

            return new JwtGuard(Auth::createUserProvider($config['provider']));
        });
    }
}

همانگونه که در مثال فوق مشاهده می‌کنید یک تابع callback به متد extend یک نمونه از Illuminate\Contracts\Auth\Guard را باز می‌گرداند. این نمونه شامل متدهای مورد نیازی است که برای تعریف گارد دلخواه خود مورد استفاده قرار می‌دهید.هنگامیکه گارد دلخواه خود را در AuthServiceProvider تعریف کردید باید آن را به فایل auth.php و آرایه‌ی guards اضافه کنید:

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

اضافه کردن یک User Provider دلخواه

اگر از جدول users برای ذخیره‌سازی کاربران استفاده نمی‌کنید همواره باید User Provider احراز هویت خود را توسعه دهید. برای اینکار از متد provider در Auth Facade استفاده کرد و یک User Provider دلخواه ایجاد می کنیم:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Auth;
use App\Extensions\RiakUserProvider;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Auth::provider('riak', function ($app, array $config) {
            // Return an instance of Illuminate\Contracts\Auth\UserProvider...

            return new RiakUserProvider($app->make('riak.connection'));
        });
    }
}

هنگامیکه با استفاده از دستورهای فوق یک provider جدید را با استفاده از متد provider ایجاد می‌کنید باید متغییر providers را در فایل auth.php تغییر داده و نام آن را به سیستم خود اضافه کنید:

'providers' => [
    'users' => [
        'driver' => 'riak',
    ],
],

و در نهایت باید نام آن Provider‌ را به متغییر guards خود اضافه کنید:

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

 

با مطالعه‌ی مطالب فوق با نحوه‌ی کار با سایر متدهای احراز هویت آشنا شده‌اید سپس به توضیح مختصر میان‌افراز HTTP Basic Authentication پرداختیم. سپس در انتهای فصل نحوه‌ی شخصی سازی گاردها و Service Providerها برای کاربران را ارائه کردیم.

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

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

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

مهدی‌یار
28 اردیبهشت 1400
خیلی هم عالی.

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

حسین
13 بهمن 1397
سلام دستتون درد نکنه مطالبتون خیلی خوب و مفیده ازشون استفاده میکنم.

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

ali
22 مرداد 1396
مطالبتون واقعا عالی هستن. خدا قوت ...

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