نسخه:

احراز هویت

معرفی

می خواهید سریع شروع کنید؟ laravel/ui بسته (1.0) Composer را نصب کرده و php artisan ui vue --auth در یک برنامه جدید لاراول اجرا کنید. پس از انتقال پایگاه داده خود، مرورگر خود را به http://your-app.test/register یا هر URL دیگری که به برنامه شما اختصاص داده شده است پیمایش کنید. این دستورات از داربست کل سیستم احراز هویت شما مراقبت می کند!

لاراول اجرای احراز هویت را بسیار ساده می کند. در واقع، تقریباً همه چیز خارج از جعبه برای شما پیکربندی شده است. فایل پیکربندی احراز هویت در آدرس قرار دارد config/auth.php که حاوی چندین گزینه مستند برای اصلاح رفتار سرویس های احراز هویت است.

در هسته خود، امکانات احراز هویت لاراول از "نگهبانان" و "ارائه دهندگان" تشکیل شده است. گاردها نحوه احراز هویت کاربران را برای هر درخواست تعریف می کنند. برای مثال، لاراول با session محافظی ارسال می‌شود که با استفاده از ذخیره‌سازی جلسه و کوکی‌ها وضعیت را حفظ می‌کند.

ارائه‌دهندگان نحوه بازیابی کاربران از فضای ذخیره‌سازی دائمی شما را تعریف می‌کنند. لاراول با پشتیبانی از بازیابی کاربران با استفاده از Eloquent و سازنده کوئری پایگاه داده ارائه می شود. با این حال، شما آزاد هستید که ارائه دهندگان اضافی را در صورت نیاز برای برنامه خود تعریف کنید.

نگران نباشید اگر همه اینها اکنون گیج کننده به نظر می رسد! بسیاری از برنامه ها هرگز نیازی به تغییر پیکربندی پیش فرض احراز هویت ندارند.

ملاحظات پایگاه داده

به طور پیش فرض، لاراول یک App\User مدل Eloquent را در فهرست شما قرار می دهد app . این مدل ممکن است با درایور پیش فرض احراز هویت Eloquent استفاده شود. اگر برنامه شما از Eloquent استفاده نمی کند، می توانید از database درایور احراز هویت استفاده کنید که از سازنده کوئری لاراول استفاده می کند.

هنگام ساخت طرح پایگاه داده برای App\User مدل، مطمئن شوید که طول ستون رمز عبور حداقل 60 کاراکتر باشد. حفظ طول ستون رشته پیش فرض 255 کاراکتر انتخاب خوبی خواهد بود.

users همچنین، باید بررسی کنید که جدول (یا معادل) شما حاوی یک remember_token ستون رشته ای 100 کاراکتری تهی باشد. این ستون برای ذخیره یک توکن برای کاربرانی که هنگام ورود به برنامه شما گزینه "مرا به خاطر بسپار" را انتخاب می کنند استفاده می شود.

احراز هویت شروع سریع

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

مسیریابی

بسته لاراول laravel/ui با استفاده از چند دستور ساده، راه سریعی را برای ایجاد داربست همه مسیرها و نماهایی که برای احراز هویت نیاز دارید ارائه می کند:

composer require laravel/ui "^1.0" --dev
 
php artisan ui vue --auth

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

اگر برنامه شما نیازی به ثبت نام ندارد، می توانید با حذف موارد جدید ایجاد شده RegisterController و تغییر دادن اعلامیه مسیر خود، آن را غیرفعال کنید Auth::routes(['register' => false]); .

ایجاد برنامه های کاربردی از جمله احراز هویت

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

laravel new blog --auth

بازدیدها

همانطور که در قسمت قبل ذکر شد، دستور laravel/ui بسته php artisan ui vue --auth تمام نماهایی را که برای احراز هویت نیاز دارید ایجاد کرده و در resources/views/auth دایرکتوری قرار می دهد.

این ui دستور همچنین یک دایرکتوری حاوی یک طرح پایه برای برنامه شما ایجاد می کند resources/views/layouts . همه این نماها از چارچوب Bootstrap CSS استفاده می کنند، اما شما آزاد هستید که آنها را هر طور که می خواهید شخصی سازی کنید.

احراز هویت

اکنون که مسیرها و نماها را برای کنترلرهای احراز هویت موجود تنظیم کرده اید، آماده ثبت نام و احراز هویت کاربران جدید برای برنامه خود هستید! شما می توانید به برنامه خود در یک مرورگر دسترسی داشته باشید زیرا کنترل کننده های احراز هویت از قبل دارای منطق (از طریق ویژگی های خود) برای احراز هویت کاربران فعلی و ذخیره کاربران جدید در پایگاه داده هستند.

سفارشی سازی مسیر

هنگامی که یک کاربر با موفقیت احراز هویت شد، به URI هدایت می شود /home . شما می توانید مسیر تغییر مسیر پس از احراز هویت را با استفاده از HOME ثابت تعریف شده در خود سفارشی کنید RouteServiceProvider :

public const HOME = '/home';

اگر به سفارشی‌سازی قوی‌تر پاسخی که هنگام احراز هویت کاربر بازگردانده می‌شود نیاز دارید، لاراول یک authenticated(Request $request, $user) روش خالی ارائه می‌کند که در صورت تمایل ممکن است بازنویسی شود:

/**
* The user has been authenticated.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function authenticated(Request $request, $user)
{
return response([
//
]);
}

سفارشی سازی نام کاربری

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

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

سفارشی سازی گارد

همچنین می توانید "گارد" را که برای احراز هویت و ثبت نام کاربران استفاده می شود، سفارشی کنید. برای شروع، یک guard متد در LoginController , RegisterController و و خود تعریف کنید ResetPasswordController . این روش باید یک نمونه محافظ را برگرداند:

use Illuminate\Support\Facades\Auth;
 
protected function guard()
{
return Auth::guard('guard-name');
}

اعتبار سنجی / سفارشی سازی ذخیره سازی

برای اصلاح فیلدهای فرم که هنگام ثبت نام کاربر جدید در برنامه شما مورد نیاز است، یا برای سفارشی کردن نحوه ذخیره کاربران جدید در پایگاه داده شما، می توانید کلاس را تغییر دهید RegisterController . این کلاس مسئول اعتبارسنجی و ایجاد کاربران جدید برنامه شما است.

روش validator شامل RegisterController قوانین اعتبارسنجی برای کاربران جدید برنامه است. شما آزادید که این روش را به دلخواه خود تغییر دهید.

create متد the مسئول RegisterController ایجاد App\User رکوردهای جدید در پایگاه داده شما با استفاده از Eloquent ORM است . شما آزاد هستید که این روش را با توجه به نیاز پایگاه داده خود تغییر دهید.

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

شما می توانید از طریق نما به کاربر احراز هویت شده دسترسی داشته باشید Auth :

use Illuminate\Support\Facades\Auth;
 
// Get the currently authenticated user...
$user = Auth::user();
 
// Get the currently authenticated user's ID...
$id = Auth::id();

از طرف دیگر، هنگامی که یک کاربر احراز هویت شد، می توانید از طریق یک Illuminate\Http\Request نمونه به کاربر احراز هویت شده دسترسی پیدا کنید. به یاد داشته باشید، کلاس های نوع اشاره به طور خودکار به روش های کنترل کننده شما تزریق می شوند:

<?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 نما استفاده کنید که true در صورت احراز هویت کاربر باز خواهد گشت:

use Illuminate\Support\Facades\Auth;
 
if (Auth::check()) {
// The user is logged in...
}

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

حفاظت از مسیرها

میان‌افزار Route می‌تواند فقط برای اجازه دادن به کاربران تأیید شده برای دسترسی به یک مسیر مشخص استفاده شود. لاراول با یک auth میان افزار ارسال می شود که در تعریف شده است Illuminate\Auth\Middleware\Authenticate . از آنجایی که این میان افزار قبلاً در هسته HTTP شما ثبت شده است، تنها کاری که باید انجام دهید این است که میان افزار را به یک تعریف مسیر متصل کنید:

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

اگر از کنترل‌کننده‌ها استفاده می‌کنید ، می‌توانید middleware متد را از سازنده کنترلر فراخوانی کنید، به جای اینکه مستقیماً آن را در تعریف مسیر ضمیمه کنید:

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

هدایت مجدد کاربران احراز هویت نشده

هنگامی که auth میان افزار کاربر غیرمجاز را شناسایی می کند، کاربر را به login مسیر نامگذاری شده هدایت می کند . شما می توانید این رفتار را با به روز رسانی redirectTo تابع موجود در app/Http/Middleware/Authenticate.php فایل خود تغییر دهید:

/**
* Get the path the user should be redirected to.
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function redirectTo($request)
{
return route('login');
}

تعیین یک نگهبان

هنگام اتصال auth میان افزار به یک مسیر، همچنین می توانید مشخص کنید که از کدام محافظ برای احراز هویت کاربر استفاده شود. محافظ مشخص شده باید با یکی از کلیدهای آرایه فایل پیکربندی guards شما مطابقت داشته باشد auth.php :

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

تایید رمز عبور

گاهی اوقات، ممکن است بخواهید از کاربر بخواهید که رمز عبور خود را قبل از دسترسی به بخش خاصی از برنامه شما تأیید کند. برای مثال، ممکن است قبل از اینکه کاربر تنظیمات صورت‌حساب را در برنامه تغییر دهد، به این نیاز داشته باشید.

برای انجام این کار، لاراول یک password.confirm میان افزار فراهم می کند. اتصال password.confirm میان‌افزار به یک مسیر، کاربران را به صفحه‌ای هدایت می‌کند که در آنجا باید رمز عبور خود را قبل از ادامه کار تأیید کنند:

Route::get('/settings/security', function () {
// Users must confirm their password before continuing...
})->middleware(['auth', 'password.confirm']);

پس از اینکه کاربر رمز عبور خود را با موفقیت تأیید کرد، کاربر به مسیری که در ابتدا سعی کرده بود به آن دسترسی داشته باشد هدایت می شود. به طور پیش فرض کاربر پس از تایید رمز عبور خود تا سه ساعت دیگر نیازی به تایید رمز عبور خود نخواهد داشت. شما آزاد هستید که مدت زمانی را که کاربر باید رمز عبور خود را مجدداً با استفاده از auth.password_timeout گزینه پیکربندی تأیید کند، سفارشی کنید.

کاهش ورود به سیستم

اگر از کلاس داخلی لاراول استفاده می کنید LoginController ، این Illuminate\Foundation\Auth\ThrottlesLogins ویژگی قبلاً در کنترلر شما گنجانده خواهد شد. به طور پیش فرض، اگر کاربر پس از چندین بار تلاش نتواند اعتبارنامه صحیح را ارائه دهد، به مدت یک دقیقه نمی تواند وارد سیستم شود. throttling برای نام کاربری / آدرس ایمیل کاربر و آدرس IP آنها منحصر به فرد است.

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

توجه داشته باشید که نیازی به استفاده از کنترلرهای احراز هویت موجود در لاراول ندارید. اگر تصمیم به حذف این کنترلرها دارید، باید احراز هویت کاربر را با استفاده از کلاس های احراز هویت لاراول به طور مستقیم مدیریت کنید. نگران نباش، این یک سینچ است!

Auth ما از طریق نما به خدمات احراز هویت لاراول دسترسی خواهیم داشت ، بنابراین باید مطمئن شویم که Auth نما را در بالای کلاس وارد می کنیم. بعد، بیایید attempt روش را بررسی کنیم:

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
 
class LoginController extends Controller
{
/**
* Handle an authentication attempt.
*
* @param \Illuminate\Http\Request $request
*
* @return Response
*/
public function authenticate(Request $request)
{
$credentials = $request->only('email', 'password');
 
if (Auth::attempt($credentials)) {
// Authentication passed...
return redirect()->intended('dashboard');
}
}
}

این attempt روش آرایه ای از جفت های کلید/مقدار را به عنوان اولین آرگومان خود می پذیرد. مقادیر موجود در آرایه برای یافتن کاربر در جدول پایگاه داده شما استفاده خواهد شد. بنابراین، در مثال بالا، کاربر با مقدار ستون بازیابی می شود email . اگر کاربر پیدا شود، رمز عبور هش شده ذخیره شده در پایگاه داده با مقدار password ارسال شده به متد از طریق آرایه مقایسه می شود. شما نباید رمز عبور مشخص شده به عنوان password مقدار را هش کنید، زیرا فریم ورک به طور خودکار مقدار را قبل از مقایسه آن با رمز عبور هش شده در پایگاه داده، هش می کند. اگر دو رمز عبور هش شده مطابقت داشته باشند، یک جلسه احراز هویت برای کاربر شروع می شود.

در صورت موفقیت آمیز بودن احراز هویت، روش attempt برمی گردد true . در غیر این صورت false عودت داده می شود.

روش intended موجود در redirector کاربر را به URL هدایت می کند که قبل از اینکه توسط میان افزار احراز هویت رهگیری شود، سعی می کرد به آن دسترسی پیدا کند. در صورتی که مقصد مورد نظر در دسترس نباشد، ممکن است یک URI بازگشتی به این روش داده شود.

تعیین شرایط اضافی

در صورت تمایل، می توانید علاوه بر ایمیل و رمز عبور کاربر، شرایط اضافی را نیز به درخواست احراز هویت اضافه کنید. به عنوان مثال، ممکن است تأیید کنیم که کاربر به عنوان "فعال" علامت گذاری شده است:

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

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

دسترسی به موارد خاص گارد

guard می‌توانید با استفاده از روش روی نما ، مشخص کنید که از کدام نمونه نگهبانی می‌خواهید استفاده کنید Auth . این به شما امکان می دهد تا با استفاده از مدل های کاملاً مجزا یا جداول کاربر، احراز هویت را برای بخش های جداگانه برنامه خود مدیریت کنید.

نام محافظ ارسال شده به guard متد باید با یکی از محافظ های پیکربندی شده در auth.php فایل پیکربندی شما مطابقت داشته باشد:

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

خروج از سیستم

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

Auth::logout();

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

اگر می‌خواهید قابلیت "مرا به خاطر بسپار" را در برنامه خود ارائه دهید، می‌توانید یک مقدار بولی را به عنوان آرگومان دوم به متد ارسال کنید attempt ، که کاربر را به طور نامحدود یا تا زمانی که به صورت دستی از سیستم خارج شود، احراز هویت باقی می‌ماند. users جدول شما باید شامل remember_token ستون رشته باشد که برای ذخیره رمز "مرا به خاطر بسپار" استفاده می شود.

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

اگر از داخلی استفاده می‌کنید LoginController که با لاراول ارسال می‌شود، منطق مناسب برای "به خاطر سپردن" کاربران قبلاً توسط ویژگی‌هایی که توسط کنترلر استفاده می‌شود پیاده‌سازی شده است.

اگر کاربران را به یاد می آورید، می توانید از این viaRemember روش برای تعیین اینکه آیا کاربر با استفاده از کوکی "مرا به خاطر بسپار" احراز هویت شده است استفاده کنید:

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

سایر روش های احراز هویت

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

اگر نیاز دارید که یک نمونه کاربری موجود را در برنامه خود وارد کنید، می توانید روش را login با نمونه کاربر فراخوانی کنید. شی داده شده باید اجرای قرارداد Illuminate\Contracts\Auth\Authenticatable باشد . مدل App\User موجود با لاراول قبلاً این رابط را پیاده سازی می کند:

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

می توانید نمونه محافظی را که می خواهید استفاده کنید مشخص کنید:

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

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

برای ورود کاربر به برنامه با شناسه خود، می توانید از این loginUsingId روش استفاده کنید. این روش کلید اصلی کاربری را که می خواهید احراز هویت کنید می پذیرد:

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

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

می توانید از once روشی برای ورود کاربر به برنامه برای یک درخواست استفاده کنید. هیچ جلسه یا کوکی استفاده نخواهد شد، به این معنی که این روش ممکن است هنگام ساخت یک API بدون حالت مفید باشد:

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

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

HTTP Basic Authentication راهی سریع برای احراز هویت کاربران برنامه شما بدون راه اندازی یک صفحه اختصاصی "ورود" فراهم می کند. برای شروع، auth.basic میان افزار را به مسیر خود متصل کنید. میان auth.basic افزار با چارچوب لاراول گنجانده شده است، بنابراین نیازی به تعریف آن ندارید:

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

هنگامی که میان افزار به مسیر متصل شد، هنگام دسترسی به مسیر در مرورگر خود، به طور خودکار از شما خواسته می شود اعتبارنامه را دریافت کنید. به‌طور پیش‌فرض، میان‌افزار از ستون روی رکورد کاربر به‌عنوان «نام کاربری» auth.basic استفاده می‌کند . email

نکته ای در مورد FastCGI

اگر از PHP FastCGI استفاده می کنید، احراز هویت پایه HTTP ممکن است به درستی کار نکند. خطوط زیر باید به .htaccess فایل شما اضافه شود:

RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

احراز هویت پایه HTTP بدون تابعیت

همچنین می‌توانید از احراز هویت پایه HTTP بدون تنظیم کوکی شناسه کاربر در جلسه استفاده کنید، که مخصوصاً برای احراز هویت API مفید است. برای انجام این کار، میان افزاری تعریف کنید که onceBasic متد را فراخوانی کند. اگر هیچ پاسخی توسط روش برگردانده نشد onceBasic ، درخواست ممکن است بیشتر به برنامه ارسال شود:

<?php
 
namespace App\Http\Middleware;
 
use Illuminate\Support\Facades\Auth;
 
class AuthenticateOnceWithBasicAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, $next)
{
return Auth::onceBasic() ?: $next($request);
}
 
}

در مرحله بعد، میان افزار مسیر را ثبت کنید و آن را به یک مسیر متصل کنید:

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

خروج از سیستم

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

use Illuminate\Support\Facades\Auth;
 
Auth::logout();

باطل کردن جلسات در سایر دستگاه ها

لاراول همچنین مکانیزمی را برای باطل کردن و «خروج از سیستم» جلسات کاربر که در دستگاه‌های دیگر فعال هستند، بدون نامعتبر کردن جلسه در دستگاه فعلی‌شان ارائه می‌کند. این ویژگی معمولاً زمانی استفاده می‌شود که کاربر در حال تغییر یا به‌روزرسانی رمز عبور خود است و شما می‌خواهید جلسات را در دستگاه‌های دیگر باطل کنید و در عین حال دستگاه فعلی را احراز هویت کنید.

قبل از شروع، باید مطمئن شوید که میان‌افزار در گروه میان‌افزار کلاس Illuminate\Session\Middleware\AuthenticateSession شما وجود دارد و نظر داده نشده است : app/Http/Kernel.php web

'web' => [
// ...
\Illuminate\Session\Middleware\AuthenticateSession::class,
// ...
],

سپس می توانید از این logoutOtherDevices روش در Auth نما استفاده کنید. این روش از کاربر می‌خواهد که رمز عبور فعلی خود را ارائه کند، که درخواست شما باید از طریق یک فرم ورودی آن را بپذیرد:

use Illuminate\Support\Facades\Auth;
 
Auth::logoutOtherDevices($password);

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

هنگام استفاده از AuthenticateSession میان‌افزار در ترکیب با نام مسیر سفارشی برای login مسیر، باید unauthenticated روش موجود در کنترل‌کننده استثنای برنامه خود را لغو کنید تا کاربران به درستی به صفحه ورود خود هدایت شوند.

افزودن گاردهای سفارشی

extend شما می توانید با استفاده از روش روی نما ، محافظ های احراز هویت خود را تعریف کنید Auth . شما باید این تماس را با extend یک ارائه دهنده خدمات برقرار کنید . از آنجایی که لاراول قبلاً با یک ارسال می شود AuthServiceProvider ، می توانیم کد را در آن ارائه دهنده قرار دهیم:

<?php
 
namespace App\Providers;
 
use App\Services\Auth\JwtGuard;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Auth;
 
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']));
});
}
}

همانطور که در مثال بالا می بینید، فراخوانی که به extend متد ارسال می شود باید پیاده سازی از Illuminate\Contracts\Auth\Guard . این رابط شامل چند روش است که برای تعریف گارد سفارشی باید پیاده سازی کنید. هنگامی که گارد سفارشی شما تعریف شد، می توانید از این محافظ در پیکربندی فایل پیکربندی guards خود استفاده کنید: auth.php

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

نگهبانان درخواست بسته شدن

ساده ترین راه برای پیاده سازی یک سیستم احراز هویت سفارشی مبتنی بر درخواست HTTP، استفاده از Auth::viaRequest روش است. این روش به شما این امکان را می‌دهد تا با استفاده از یک بسته به سرعت فرآیند احراز هویت خود را تعریف کنید.

برای شروع، Auth::viaRequest متد موجود در boot متد خود را فراخوانی کنید AuthServiceProvider . این viaRequest متد یک نام درایور احراز هویت را به عنوان اولین آرگومان خود می پذیرد. این نام می تواند هر رشته ای باشد که گارد سفارشی شما را توصیف کند. آرگومان دومی که به متد ارسال می‌شود باید یک Closure باشد که درخواست HTTP ورودی را دریافت کرده و یک نمونه کاربر را برمی‌گرداند یا در صورت عدم موفقیت احراز هویت، null :

use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
 
/**
* Register any application authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
 
Auth::viaRequest('custom-token', function ($request) {
return User::where('token', $request->token)->first();
});
}

هنگامی که درایور احراز هویت سفارشی شما تعریف شد، از آن به عنوان درایور در پیکربندی فایل پیکربندی guards خود استفاده می کنید: auth.php

'guards' => [
'api' => [
'driver' => 'custom-token',
],
],

اضافه کردن ارائه دهندگان کاربر سفارشی

اگر از یک پایگاه داده سنتی رابطه ای برای ذخیره کاربران خود استفاده نمی کنید، باید لاراول را با ارائه دهنده کاربر احراز هویت خود گسترش دهید. ما از provider روش روی Auth نما برای تعریف یک ارائه دهنده کاربر سفارشی استفاده خواهیم کرد:

<?php
 
namespace App\Providers;
 
use App\Extensions\RiakUserProvider;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Auth;
 
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 ، می توانید در auth.php فایل پیکربندی خود به ارائه دهنده کاربر جدید بروید. ابتدا یک provider درایور جدید را تعریف کنید:

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

در نهایت، می توانید از این ارائه دهنده در guards پیکربندی خود استفاده کنید:

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

قرارداد ارائه دهنده کاربر

پیاده‌سازی‌ها Illuminate\Contracts\Auth\UserProvider فقط مسئول واکشی یک Illuminate\Contracts\Auth\Authenticatable پیاده‌سازی از یک سیستم ذخیره‌سازی دائمی مانند MySQL، Riak و غیره هستند. این دو رابط به مکانیسم‌های احراز هویت لاراول اجازه می‌دهند بدون توجه به نحوه ذخیره داده‌های کاربر یا نوع کلاس استفاده شده، به عملکرد خود ادامه دهند. برای نمایندگی آن

بیایید نگاهی به Illuminate\Contracts\Auth\UserProvider قرارداد بیندازیم:

<?php
 
namespace Illuminate\Contracts\Auth;
 
interface UserProvider
{
public function retrieveById($identifier);
public function retrieveByToken($identifier, $token);
public function updateRememberToken(Authenticatable $user, $token);
public function retrieveByCredentials(array $credentials);
public function validateCredentials(Authenticatable $user, array $credentials);
}

تابع retrieveById معمولاً کلیدی را دریافت می کند که کاربر را نشان می دهد، مانند شناسه افزایش خودکار از پایگاه داده MySQL. پیاده Authenticatable سازی منطبق با شناسه باید با روش بازیابی و برگردانده شود.

این retrieveByToken تابع یک کاربر را با استفاده از $identifier "مرا به خاطر بسپار" را $token که در یک فیلد ذخیره شده است، بازیابی می کند remember_token . همانند روش قبلی، Authenticatable پیاده سازی باید برگردانده شود.

این updateRememberToken روش $user فیلد را remember_token با جدید به روز می کند $token . یک توکن جدید در تلاش موفق برای ورود به سیستم "مرا به خاطر بسپار" یا زمانی که کاربر در حال خروج از سیستم است، اختصاص داده می شود.

این روش هنگام تلاش برای ورود به یک برنامه، retrieveByCredentials آرایه ای از اعتبارنامه ها را دریافت می کند . Auth::attempt سپس این روش باید برای کاربر مطابق با آن اعتبارنامه ها، فضای ذخیره سازی دائمی زیرین را "پرس و جو" کند. به طور معمول، این روش یک پرس و جو را با شرط "where" در $credentials['username'] . سپس متد باید پیاده سازی را برگرداند Authenticatable . این روش نباید هیچ گونه اعتبارسنجی یا احراز هویت رمز عبور را انجام دهد.

این روش باید برای احراز هویت کاربر، validateCredentials داده های داده شده را $user با آن مقایسه کند. $credentials برای مثال، این روش احتمالاً باید Hash::check برای مقایسه مقدار $user->getAuthPassword() با مقدار $credentials['password'] . این روش باید برگردد true یا false نشان دهد که آیا رمز عبور معتبر است یا خیر.

قرارداد قابل احراز هویت

اکنون که هر یک از روش ها را بررسی کردیم UserProvider ، اجازه دهید نگاهی به Authenticatable قرارداد بیندازیم. به یاد داشته باشید، ارائه‌دهنده باید پیاده‌سازی‌های این رابط را از retrieveById , retrieveByToken و retrieveByCredentials متدها برگرداند:

<?php
 
namespace Illuminate\Contracts\Auth;
 
interface Authenticatable
{
public function getAuthIdentifierName();
public function getAuthIdentifier();
public function getAuthPassword();
public function getRememberToken();
public function setRememberToken($value);
public function getRememberTokenName();
}

این رابط کاربری ساده است. متد getAuthIdentifierName باید نام فیلد "کلید اصلی" کاربر و getAuthIdentifier متد باید "کلید اصلی" کاربر را برگرداند. در بک‌اند MySQL، دوباره، این کلید اصلی افزایش خودکار است. باید getAuthPassword رمز عبور هش شده کاربر را برگرداند. این رابط به سیستم احراز هویت اجازه می دهد تا با هر کلاس کاربری، صرف نظر از اینکه از چه ORM یا لایه انتزاعی ذخیره سازی استفاده می کنید، کار کند. به‌طور پیش‌فرض، لاراول شامل یک User کلاس در app دایرکتوری است که این رابط را پیاده‌سازی می‌کند، بنابراین می‌توانید برای مثال پیاده‌سازی با این کلاس مشورت کنید.

مناسبت ها

لاراول در طول فرآیند احراز هویت رویدادهای مختلفی را مطرح می کند . می توانید شنوندگان را به این رویدادها در موارد زیر متصل کنید EventServiceProvider :

/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Auth\Events\Registered' => [
'App\Listeners\LogRegisteredUser',
],
 
'Illuminate\Auth\Events\Attempting' => [
'App\Listeners\LogAuthenticationAttempt',
],
 
'Illuminate\Auth\Events\Authenticated' => [
'App\Listeners\LogAuthenticated',
],
 
'Illuminate\Auth\Events\Login' => [
'App\Listeners\LogSuccessfulLogin',
],
 
'Illuminate\Auth\Events\Failed' => [
'App\Listeners\LogFailedLogin',
],
 
'Illuminate\Auth\Events\Logout' => [
'App\Listeners\LogSuccessfulLogout',
],
 
'Illuminate\Auth\Events\Lockout' => [
'App\Listeners\LogLockout',
],
 
'Illuminate\Auth\Events\PasswordReset' => [
'App\Listeners\LogPasswordReset',
],
];