Authentication
لاراول یک سیستم Authentication شامل امکاناتی نظیر احراز هویت (کاربر جاری چه نقشی داره ؟ مهمان یا عضو ) ، ثبت نام (Register) ، ورود و خروج (Login – Logout) و بازیابی پسورد (درخواست پسورد جدید و امکان ارسال آن به ایمیل) و … در اختیار شما قرار می دهد.
در حالی که بسیاری از موارد آن برای شما پیکره بندی شده است این امکان را برای شما فراهم می کند تا این سیستم را بنا به نیاز خود تغییر بدهید.
تنظیمات مربوط به authentication در مسیر config/auth.php
موجود می باشد.
Authentication Quickstart
برای برپایی سیستم authentication در لاراول باید دستور زیر را وارد کنید:
php artisan make:auth
Authentication Controllers
سیستم مرکزی پردازش نرم افزار ما controller بود. پس از اجرای دستور بالا controller های زیر در مسیر App\Http\Controllers\Auth
به برنامه ما اضافه می شوند.
- RegisterController
- LoginController
- ForgotPasswordController
- ResetPasswordController
چون موارد اضافه شده واقع در مسیر App\Http\Controllers
می باشند لذا جزو هسته به شمار نمی آیند و شما بسته به نیاز می توانید تغییراتی را در متد های هر یک از controller های موجود در آن ها بدهید.
Authentication Model
به صورت پیش فرض برای ماژول authentication ما App\User
Eloquent model را داریم. دقت داشته باشید که مدل ساخته شده بر اساس Eloquent ORM می باشد.
Authentication Migration
جداول پایگاه داده پیش فرض در ماژول authentication با نام های users , password_resets می باشد که migration های مربوط به این دو جدول با نام های زیر پیاده سازی می شوند.
- create_users_table
- create_password_resets_table
نکته : پس از اجرای دستور make:auth
جداول در پایگاه داده ساخته نمی شوند و تنها migration های آن ها ساخته می شود. خوب اگر با ساختار جداول در پایگاه داده مشکلی ندارید دستور php aritisan migrate
را بزنید.
نکته : شما می توانید پس از مشاهده ساختار migration آن را با توجه به نیاز خودتان تغییر دهید و بعد دستور migrate را اجرا کنید.فقط دقت داشته باشید که قوانین کلی برای برخی فیلد ها را باید رعایت کنید :
- password : در جدول users از نوع string و حداقل طول 60 کاراکتر (با توجه به الگوریتم رمز نگاری استفاده شده در لاراول)
- remember_token : در جدول users از نوع string و با قابلیت nullable و حداقل 100 کاراکتر که با متد
rememberToken
با همین ویژگی ها ساخته می شود.
Authentication Routes
پس از برپایی ماژول authentication در نرم افزار دو خط کد زیر به فایل web.php (مربوط به route های نرم افزار) اضافه می شود:
<?php Auth::routes(); Route::get('/home', 'HomeController@index');
کدهای زیر expand شده دو کد بالاست :
<?php // Authentication Routes... $this->get('login', 'Auth\LoginController@showLoginForm')->name('login'); $this->post('login', 'Auth\LoginController@login'); $this->post('logout', 'Auth\LoginController@logout')->name('logout'); // Registration Routes... $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register'); $this->post('register', 'Auth\RegisterController@register'); // Password Reset Routes... $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm'); $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail'); $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm'); $this->post('password/reset', 'Auth\ResetPasswordController@reset');
همچنین با فرمان php artisan route:list
می توانید لیست route های اضافه شده به نرم افزار را پس از برپایی authentication مشاهده فرمایید.
Authentication View
پس از برپایی سیستم authentication در نرم افزار فایل های view در مسیر resources/views/auth
ساخته می شوند. همچنین دو فایل views/layouts/app.blade.php
و views/home.blade.php
ساخته می شود که هر کدام که از قبل موجود باشد از شما می پرسد که دوباره بسازد یا خیر.
نکته : Helper هایی در رابطه با authentication در قسمت view وجود دارد که می توانید با استفاده از این توابع در view ها نیز از امکانات authentication استفاده کنید. مثلا احراز هویت کاربر مهمان و یا عضو وب سایت با template زیر
@auth // The user is authenticated... @endauth @guest // The user is not authenticated... @endguest
Authenticating
پس از پیاده سازی پایگاه داده ، controllers ، views ، Routes ، Model در نرم افزار شما این امکان برای شما فراهم بود تا بتوانید از امکانات سیستم authentication در لاراول استفاده کنید.
شما با تغییر در امکاناتی که در هسته مرکزی پردازش authentication یا همان controller ها برای شما قرار داده شده می تونید این سیستم رو برای خودتون شخصی سازی کنید. این شخصی سازی می تونه شامل تغییر در properties , methods موجود باشه یا این که تعریف method جدید در controller های تعریف شده.
همچنین با استفاده از Auth
(Auth facade) می تونید از امکانات تعبیه شده در ماژول authentication استفاده کنید.
Path Customization
به صورت پیش فرض پس از عملیات های authenticate کاربر به /Home
ریدایرکت می شود.(به همین دلیل route و view مربوط به Home پس از برپایی authentication برای نرم افزار اضافه می شود).
برای تغییر مسیر redirect پس از authentication باید در controller های زیر property را تعریف کنید:
<?php protected $redirectTo = '/';
همچنین اگر برای تعیین مسیر redirect نیاز به منطق و محاسبات داشتید باید method با نام redirectTo
تعیین کنید.
<?php protected function redirectTo() { return '/path'; }
نکته : اولویت method برای تعیین مسیر redirect بالا تر از property آن است.
نکته : مقادیر RedirectTo
برای زمان Login , Logout , Register می باشد . در کلاس های RegisterController
و LoginController
باید پیاده سازی شود.
نکته :مقداری که باید در method یا property تعیین کنیم برای بازگشت باید از نوع path باشد. از همان نوع مقداری که در route می دادیم.
Username Customization
فرم ثبت نام کاربر دارای یک سری فیلد ها می باشد(name , email , password). این فیلد ها در جدول users در پایگاه داده نیز هست.
همان طور که می دانید برای تغییر یه روند در نرم افزار باید سه مسیر زیر را طی کرد :
- پروسه انجام – Controller
- پایگاه داده – migration – DB , model
- نمایش – view
برای هر سیستم authentication یک نام کاربری یکتا به ازای هر کاربر نیاز داریم. به صورت پیش فرض لاراول از email به عنوان نام کاربری استفاده می کند. برای تغییر این مورد باید سه روند بالا را در نظر داشته باشیم :
- تغییر در controller مربوطه
- تغییر در پایگاه داده در صورت نیاز
- تغییر فرم ثبت نام در صورت نیاز (باید فیلد مربوطه در فرم ثبت نام باشد و در پایگاه داده کاربر ثبت گردد که در پروسه controller آن را به عنوان username ثبت کنیم)
پس از تغییر در پایگاه داده و فرم ثبت نام باید به سراغ LoginController
برویم و پس از آن به سراغ متد username برویم و مقدار بازگشتی آن را تغییر دهیم:
<?php public function username() { return 'username'; }
Retrieving The Authenticated User
برای دریافت کاربر جاری می توان از Auth
facade استفاده کرد :
<?php use Illuminate\Support\Facades\Auth; // Get the currently authenticated user... $user = Auth::user(); // Get the currently authenticated user's ID... $id = Auth::id();
همچنین با استفاده از شئ 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) { //returns an instance of the authenticated user... $request->user() } }
Protecting Routes
به ازای هر Path از route یک callback اجرا می گردد. حالا اگر ما بخواهیم که تنها callback برای کاربران لاگین اجرا بشه باید از route محافظت کنیم.
ما به دو روش می توانیم از یک درخواست محافظت کنیم :
- مستقیما به route از auth استفاده کنیم
- در درون __construct از متدهای auth Middleware استفاده کنیم.
هر path از route به یک method از یک کلاس از controller میره . پس ما نهایتا از method ها محافظت کنیم.
همونطور که می دونید پس از ساخت شی اولین متدی که فراخوانی میشه __construct
هست. پس باید این محافظت از درون __construct
انجام بشه. به شکلی که ما نام متد هایی که به ازای آن ها باید کاربر لاگین باشد به وسیله Middleware با نام auth
می آوریم:
auth Middleware
<?php public function __construct() { $this->middleware('auth'); }
در مثال بالا گفتیم که تمامی method های موجود در این کلاس (کلاسی که __construct
آن من هستم) باید برای دسترسی به آن ها کاربر درخواست دهنده لاگین باشد.
<?php Route::get('profile', function () { // Only authenticated users may enter... })->middleware('auth');
در مثال بالا گفتیم که این route با این نام (profile) توسط middleware با نام auth محافظت می شود. یعنی تنها callback برای کاربران درخواست دهنده ای اجرا می شود که لاگین کرده باشند.
only Method
<?php public function __construct() { $this->middleware('auth')->only(['createProduct','admin']); }
در مثال بالا گفتیم تنها method هایی با نام های createProduct
و admin
باید در صورتی برای کاربر درخواست دهنده اجرا گردند که کاربر لاگین باشد.
except Method
<?php public function __construct() { $this->middleware('auth')->except(['archive','single']); }
در مثال بالا گفته که غیر از متد های archive
, single
تمامی متد های کلاس ProductController
(مثال) برای نمایش نیاز به لاگین دارد.
guest Middleware
guest دقیقا برعکس auth عمل می کند. یعنی اگر از متدهای only
و except
از آن استفاده کنیم نتیجه ای برعکس نتایج بالا را می دهد.
نکته : میان افزار های auth و guest در دسته میان افزارهای routeMiddlewares قرار دارد.
دیدگاهتان را بنویسید