احراز هویت
- معرفی
- احراز هویت شروع سریع
- احراز هویت دستی کاربران
- احراز هویت پایه HTTP
- خروج از سیستم
- احراز هویت اجتماعی
- افزودن گاردهای سفارشی
- اضافه کردن ارائه دهندگان کاربر سفارشی
- مناسبت ها
معرفی
می خواهید سریع شروع کنید؟
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.}
در این مثال ها،
دسترسی به موارد خاص گارد
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', ],];