نسخه:

احراز هویت

معرفی

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

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

به یاد داشته باشید: هنگام ساخت طرح پایگاه داده برای این مدل، ستون رمز عبور حداقل 60 کاراکتر باشد. همچنین، قبل از شروع، مطمئن شوید که جدول شما (یا معادل آن) دارای یک ستون رشته ای با 100 کاراکتر users تهی باشد . remember_token از این ستون برای ذخیره یک نشانه برای جلسات "مرا به خاطر بسپار" که توسط برنامه شما نگهداری می شود استفاده می شود. $table->rememberToken(); این را می توان با استفاده از یک مهاجرت انجام داد . البته لاراول 5 مهاجرت های این ستون ها را خارج از جعبه ارسال می کند!

اگر برنامه شما از Eloquent استفاده نمی کند، می توانید از database درایور احراز هویت استفاده کنید که از سازنده کوئری لاراول استفاده می کند.

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

لاراول با دو کنترلر مرتبط با احراز هویت خارج از جعبه ارسال می شود. AuthController ثبت نام کاربر جدید و "ورود به سیستم" را انجام می دهد، در حالی که منطقی PasswordController برای کمک به کاربران فعلی برای بازنشانی رمزهای عبور فراموش شده خود دارد.

هر یک از این کنترل‌کننده‌ها از یک صفت برای گنجاندن روش‌های ضروری خود استفاده می‌کنند. برای بسیاری از برنامه ها، به هیچ وجه نیازی به تغییر این کنترلرها نخواهید داشت. نماهایی که این کنترلرها ارائه می دهند در resources/views/auth دایرکتوری قرار دارند. شما آزاد هستید که این نماها را هر طور که می خواهید سفارشی کنید.

ثبت نام کاربر

برای تغییر فیلدهای فرم که هنگام ثبت نام کاربر جدید در برنامه شما لازم است، می توانید App\Services\Registrar کلاس را تغییر دهید. این کلاس مسئول اعتبارسنجی و ایجاد کاربران جدید برنامه شما است.

validator روش the حاوی Registrar قوانین اعتبارسنجی برای کاربران جدید برنامه است، در حالی که create روش the Registrar مسئول ایجاد User رکوردهای جدید در پایگاه داده شما است. شما آزاد هستید که هر یک از این روش ها را به دلخواه خود تغییر دهید. Registrar توسط AuthController روش های موجود در صفت فراخوانی می شود AuthenticatesAndRegistersUsers .

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

اگر تصمیم گرفتید از AuthController پیاده سازی ارائه شده استفاده نکنید، باید احراز هویت کاربران خود را با استفاده از کلاس های احراز هویت لاراول به طور مستقیم مدیریت کنید. نگران نباشید، این هنوز یک سینچ است! ابتدا بیایید attempt روش را بررسی کنیم:

<?php namespace App\Http\Controllers;
 
use Auth;
use Illuminate\Routing\Controller;
 
class AuthController extends Controller {
 
/**
* Handle an authentication attempt.
*
* @return Response
*/
public function authenticate()
{
if (Auth::attempt(['email' => $email, 'password' => $password]))
{
return redirect()->intended('dashboard');
}
}
 
}

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

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

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

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

احراز هویت یک کاربر با شرایط

همچنین می توانید شرایط اضافی را به جستار احراز هویت اضافه کنید:

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

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

برای تعیین اینکه آیا کاربر قبلاً وارد برنامه شما شده است، می توانید از check روش زیر استفاده کنید:

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

احراز هویت یک کاربر و "به خاطر سپردن" آنها

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

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

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

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

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

برای ورود کاربر به برنامه با شناسه خود، از loginUsingId روش زیر استفاده کنید:

Auth::loginUsingId(1);

اعتبارسنجی اعتبار کاربر بدون ورود به سیستم

این validate روش به شما اجازه می‌دهد تا اعتبار کاربر را بدون ورود به برنامه، اعتبارسنجی کنید:

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

ورود کاربر برای یک درخواست واحد

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

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

ورود دستی کاربر

اگر می‌خواهید یک نمونه کاربری موجود را در برنامه خود وارد کنید، می‌توانید متد را login با نمونه کاربر فراخوانی کنید:

Auth::login($user);

این معادل ورود کاربر از طریق اعتبار با استفاده از attempt روش است.

خروج کاربر از برنامه

Auth::logout();

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

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

هنگامی که attempt متد فراخوانی می شود، auth.attempt رویداد فعال می شود. اگر تلاش برای احراز هویت با موفقیت انجام شود و کاربر وارد شده باشد، auth.login رویداد نیز فعال خواهد شد.

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

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

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

<?php
 
namespace App\Http\Controllers;
 
use Auth;
use Illuminate\Routing\Controller;
 
class ProfileController extends Controller {
 
/**
* Update the user's profile.
*
* @return Response
*/
public function updateProfile()
{
if (Auth::user())
{
// Auth::user() returns an instance of the authenticated user...
}
}
 
}

دوم، شما می توانید از طریق یک نمونه به کاربر احراز هویت شده دسترسی داشته باشید Illuminate\Http\Request :

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
 
class ProfileController extends Controller {
 
/**
* Update the user's profile.
*
* @return Response
*/
public function updateProfile(Request $request)
{
if ($request->user())
{
// $request->user() returns an instance of the authenticated user...
}
}
 
}

ثالثاً، می توانید قرارداد را تایپ کنید Illuminate\Contracts\Auth\Authenticatable . این نوع اشاره ممکن است به سازنده کنترلر، متد کنترلر یا هر سازنده دیگری از یک کلاس که توسط کانتینر سرویس حل شده است اضافه شود :

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Routing\Controller;
use Illuminate\Contracts\Auth\Authenticatable;
 
class ProfileController extends Controller {
 
/**
* Update the user's profile.
*
* @return Response
*/
public function updateProfile(Authenticatable $user)
{
// $user is an instance of the authenticated user...
}
 
}

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

میان‌افزار Route می‌تواند استفاده شود تا فقط کاربران احراز هویت شده بتوانند به یک مسیر مشخص دسترسی داشته باشند. لاراول auth به طور پیش فرض میان افزار را ارائه می دهد و در تعریف شده است app\Http\Middleware\Authenticate.php . تنها کاری که باید انجام دهید این است که آن را به یک تعریف مسیر متصل کنید:

// With A Route Closure...
 
Route::get('profile', ['middleware' => 'auth', function()
{
// Only authenticated users may enter...
}]);
 
// With A Controller...
 
Route::get('profile', ['middleware' => 'auth', 'uses' => 'ProfileController@show']);

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

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

محافظت از یک مسیر با HTTP Basic

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

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

راه اندازی یک فیلتر اصلی HTTP بدون تابعیت

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

public function handle($request, Closure $next)
{
return Auth::onceBasic() ?: $next($request);
}

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

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

یادآوری رمز عبور و بازنشانی

مدل و میز

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

برای شروع، بررسی کنید که User مدل شما Illuminate\Contracts\Auth\CanResetPassword قرارداد را اجرا می کند. البته، User مدلی که با فریم ورک ارائه می‌شود، قبلاً این رابط را پیاده‌سازی می‌کند و از این Illuminate\Auth\Passwords\CanResetPassword ویژگی برای دربرداشتن روش‌های مورد نیاز برای پیاده‌سازی رابط استفاده می‌کند.

ایجاد مهاجرت جدول یادآوری

در مرحله بعد، باید جدولی برای ذخیره رمزهای بازنشانی رمز عبور ایجاد شود. مهاجرت این جدول با لاراول خارج از جعبه گنجانده شده است و در database/migrations دایرکتوری قرار دارد. بنابراین تنها کاری که باید انجام دهید این است که مهاجرت کنید:

php artisan migrate

کنترلر یادآور رمز عبور

لاراول همچنین شامل Auth\PasswordController منطق لازم برای تنظیم مجدد رمزهای عبور کاربر است. ما حتی برای شروع شما نماهایی ارائه کرده ایم! نماها در resources/views/auth دایرکتوری قرار دارند. شما آزاد هستید که این نماها را مطابق با طراحی برنامه خود تغییر دهید.

کاربر شما یک ایمیل با پیوندی دریافت می کند که به getReset روش PasswordController . این روش فرم بازنشانی رمز عبور را ارائه می دهد و به کاربران امکان می دهد رمز عبور خود را بازنشانی کنند. پس از بازنشانی رمز عبور، کاربر به طور خودکار وارد برنامه می شود و به آن هدایت می شود /home . redirectTo شما می توانید با تعریف یک ویژگی در مورد زیر ، مکان تغییر مسیر پس از تنظیم مجدد را سفارشی کنید PasswordController :

protected $redirectTo = '/dashboard';

توجه: به طور پیش فرض، رمزهای بازنشانی رمز عبور پس از یک ساعت منقضی می شوند. می توانید این مورد را از طریق reminder.expire گزینه موجود در config/auth.php فایل خود تغییر دهید.

احراز هویت اجتماعی

علاوه بر احراز هویت معمولی و مبتنی بر فرم، لاراول همچنین یک راه ساده و راحت برای احراز هویت با ارائه دهندگان OAuth با استفاده از Laravel Socialite ارائه می دهد . Socialite در حال حاضر از احراز هویت با Facebook، Twitter، Google، GitHub و Bitbucket پشتیبانی می کند.

برای شروع کار با Socialite، بسته را در composer.json فایل خود قرار دهید:

"laravel/socialite": "~2.0"

سپس در فایل پیکربندی Laravel\Socialite\SocialiteServiceProvider خود ثبت کنید. config/app.php همچنین می توانید نما را ثبت کنید :

'Socialize' => 'Laravel\Socialite\Facades\Socialite',

شما باید اعتبارنامه‌هایی را برای سرویس‌های OAuth که برنامه شما از آن استفاده می‌کند، اضافه کنید. این اعتبارنامه ها باید در فایل پیکربندی شما قرار داده شوند و بسته به ارائه دهندگانی که برنامه شما به آن نیاز دارد، config/services.php باید از کلید facebook ، twitter , google یا , استفاده کنند. github مثلا:

'github' => [
'client_id' => 'your-github-app-id',
'client_secret' => 'your-github-app-secret',
'redirect' => 'http://your-callback-url',
],

در مرحله بعد، شما آماده احراز هویت کاربران هستید! شما به دو مسیر نیاز دارید: یکی برای هدایت کاربر به ارائه‌دهنده OAuth و دیگری برای دریافت پاسخ تماس از ارائه‌دهنده پس از احراز هویت. در اینجا یک مثال با استفاده از Socialize نما آورده شده است:

public function redirectToProvider()
{
return Socialize::with('github')->redirect();
}
 
public function handleProviderCallback()
{
$user = Socialize::with('github')->user();
 
// $user->token;
}

این redirect روش مراقب ارسال کاربر به ارائه‌دهنده OAuth است، در حالی که user روش درخواست دریافتی را می‌خواند و اطلاعات کاربر را از ارائه‌دهنده بازیابی می‌کند. قبل از هدایت کاربر، می‌توانید «Scopes» را نیز روی درخواست تنظیم کنید:

return Socialize::with('github')->scopes(['scope1', 'scope2'])->redirect();

هنگامی که یک نمونه کاربری دارید، می توانید جزئیات بیشتری در مورد کاربر بدست آورید:

بازیابی اطلاعات کاربر

$user = Socialize::with('github')->user();
 
// OAuth Two Providers
$token = $user->token;
 
// OAuth One Providers
$token = $user->token;
$tokenSecret = $user->tokenSecret;
 
// All Providers
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();