احراز هویت
- معرفی
- احراز هویت کاربران
- بازیابی کاربر تایید شده
- حفاظت از مسیرها
- احراز هویت پایه HTTP
- یادآوری رمز عبور و بازنشانی
- احراز هویت اجتماعی
معرفی
لاراول اجرای احراز هویت را بسیار ساده می کند.
در واقع، تقریباً همه چیز خارج از جعبه برای شما پیکربندی شده است.
فایل پیکربندی احراز هویت در آدرس قرار دارد
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
عودت داده می شود.
نکته: در این مثال،
تابع
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();