امنیت
- پیکربندی
- ذخیره سازی رمزهای عبور
- احراز هویت کاربران
- ورود دستی کاربران
- حفاظت از مسیرها
- احراز هویت پایه HTTP
- یادآوری رمز عبور و بازنشانی
- رمزگذاری
- درایورهای احراز هویت
پیکربندی
لاراول قصد دارد پیاده سازی احراز هویت را بسیار ساده کند.
در واقع، تقریباً همه چیز خارج از جعبه برای شما پیکربندی شده است.
فایل پیکربندی احراز هویت در آدرس قرار دارد
app/config/auth.php
که حاوی چندین گزینه مستند برای تغییر رفتار امکانات احراز هویت است.
بهطور پیشفرض، لاراول
User
مدلی را در فهرست شما قرار میدهد
app/models
که ممکن است با درایور پیشفرض احراز هویت Eloquent استفاده شود.
لطفاً هنگام ساختن طرحواره برای این مدل به یاد داشته باشید که فیلد رمز
عبور حداقل 60 کاراکتر باشد.
اگر برنامه شما از Eloquent استفاده نمی کند، می توانید از
database
درایور احراز هویت استفاده کنید که از سازنده کوئری لاراول استفاده می کند.
توجه: قبل از شروع، مطمئن شوید که
users
جدول شما (یا معادل آن) دارای یک ستون رشته ایremember_token
100 کاراکتری تهی باشد. از این ستون برای ذخیره یک نشانه برای جلسات "مرا به خاطر بسپار" که توسط برنامه شما نگهداری می شود استفاده می شود.$table->rememberToken();
این را می توان با استفاده از یک مهاجرت انجام داد .
ذخیره سازی رمزهای عبور
کلاس لاراول
Hash
هش Bcrypt ایمن را فراهم می کند:
هش کردن رمز عبور با استفاده از Bcrypt
$password = Hash::make('secret');
تأیید یک رمز عبور در برابر هش
if (Hash::check('secret', $hashedPassword)){ // The passwords match...}
بررسی اینکه آیا یک رمز عبور نیاز به اصلاح مجدد دارد یا خیر
if (Hash::needsRehash($hashed)){ $hashed = Hash::make('secret');}
احراز هویت کاربران
برای ورود کاربر به برنامه خود، می توانید از این
Auth::attempt
روش استفاده کنید.
if (Auth::attempt(array('email' => $email, 'password' => $password))){ return Redirect::intended('dashboard');}
توجه داشته باشید که
email
یک گزینه ضروری نیست، فقط برای مثال استفاده می شود.
شما باید از هر نام ستونی که با یک "نام کاربری" در پایگاه داده خود مطابقت
دارد استفاده کنید.
این
Redirect::intended
تابع کاربر را به URL هدایت می کند که قبل از اینکه توسط فیلتر احراز هویت
گیر بیفتد، سعی می کرد به آن دسترسی پیدا کند.
در صورتی که مقصد مورد نظر در دسترس نباشد، ممکن است یک URI بازگشتی به این
روش داده شود.
هنگامی که
attempt
متد فراخوانی می شود،
auth.attempt
رویداد
فعال می شود.
اگر تلاش برای احراز هویت با موفقیت انجام شود و کاربر وارد شده باشد،
auth.login
رویداد نیز فعال خواهد شد.
تعیین اینکه آیا یک کاربر احراز هویت شده است
برای تعیین اینکه آیا کاربر قبلاً وارد برنامه شما شده است، می توانید از
check
روش زیر استفاده کنید:
if (Auth::check()){ // The user is logged in...}
احراز هویت یک کاربر و "به خاطر سپردن" آنها
اگر میخواهید قابلیت "مرا به خاطر بسپار" را در برنامه خود ارائه دهید،
میتوانید
true
به عنوان آرگومان دوم به
attempt
روش ارسال کنید، که کاربر را به طور نامحدود (یا تا زمانی که به صورت دستی
از سیستم خارج شود) احراز هویت میشود.
البته،
users
جدول شما باید شامل ستون رشته باشد
remember_token
، که برای ذخیره رمز "مرا به خاطر بسپار" استفاده می شود.
if (Auth::attempt(array('email' => $email, 'password' => $password), true)){ // The user is being remembered...}
توجه:
اگر
attempt
روش برگردد
true
، کاربر به عنوان وارد شده به برنامه در نظر گرفته می شود.
تعیین اینکه آیا کاربر تأیید اعتبار شده است یا خیر
اگر در حال "به خاطر سپردن" ورود کاربران هستید، می توانید از این
viaRemember
روش برای تعیین اینکه آیا کاربر با استفاده از کوکی "Memember Me" احراز
هویت شده است استفاده کنید:
if (Auth::viaRemember()){ //}
احراز هویت یک کاربر با شرایط
همچنین می توانید شرایط اضافی را به جستار احراز هویت اضافه کنید:
if (Auth::attempt(array('email' => $email, 'password' => $password, 'active' => 1))){ // The user is active, not suspended, and exists.}
توجه: برای محافظت بیشتر در برابر تثبیت جلسه، شناسه جلسه کاربر پس از احراز هویت به طور خودکار بازسازی می شود.
دسترسی به کاربر وارد شده
هنگامی که یک کاربر احراز هویت شد، می توانید به مدل / رکورد کاربر دسترسی داشته باشید:
$email = Auth::user()->email;
برای بازیابی شناسه کاربر تأیید شده، می توانید از
id
روش زیر استفاده کنید:
$id = Auth::id();
برای ورود ساده کاربر به برنامه با شناسه خود، از
loginUsingId
روش زیر استفاده کنید:
Auth::loginUsingId(1);
اعتبارسنجی اعتبار کاربر بدون ورود به سیستم
این
validate
روش به شما اجازه میدهد تا اعتبار کاربر را بدون ورود به برنامه،
اعتبارسنجی کنید:
if (Auth::validate($credentials)){ //}
ورود کاربر برای یک درخواست واحد
همچنین می توانید از این
once
روش برای ورود کاربر به برنامه برای یک درخواست استفاده کنید.
هیچ جلسه یا کوکی استفاده نخواهد شد.
if (Auth::once($credentials)){ //}
خروج کاربر از برنامه
Auth::logout();
ورود دستی کاربران
اگر میخواهید یک نمونه کاربری موجود را در برنامه خود وارد کنید، میتوانید
به سادگی متد را
login
با این نمونه فراخوانی کنید:
$user = User::find(1); Auth::login($user);
این معادل ورود کاربر از طریق اعتبار با استفاده از
attempt
روش است.
حفاظت از مسیرها
ممکن است از فیلترهای مسیر استفاده شود تا فقط کاربران احراز هویت شده
بتوانند به یک مسیر مشخص دسترسی داشته باشند.
لاراول
auth
به صورت پیش فرض فیلتر را ارائه می دهد و در تعریف شده است
app/filters.php
.
محافظت از یک مسیر
Route::get('profile', array('before' => 'auth', function(){ // Only authenticated users may enter...}));
حفاظت CSRF
لاراول روشی آسان برای محافظت از برنامه شما در برابر جعل درخواست های بین سایتی ارائه می دهد.
درج توکن CSRF در فرم
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
اعتبار توکن CSRF ارسال شده را تأیید کنید
Route::post('register', array('before' => 'csrf', function(){ return 'You gave a valid CSRF token!';}));
احراز هویت پایه HTTP
HTTP Basic Authentication راهی سریع برای احراز هویت کاربران برنامه شما
بدون راه اندازی یک صفحه اختصاصی "ورود" فراهم می کند.
برای شروع،
auth.basic
فیلتر را به مسیر خود وصل کنید:
محافظت از یک مسیر با HTTP Basic
Route::get('profile', array('before' => 'auth.basic', function(){ // Only authenticated users may enter...}));
بهطور پیشفرض، فیلتر
هنگام احراز هویت از ستون روی رکورد کاربر
basic
استفاده میکند .
email
اگر می خواهید از ستون دیگری استفاده کنید، می توانید نام ستون را به عنوان
اولین پارامتر به
basic
متد موجود در فایل خود ارسال کنید
app/filters.php
:
Route::filter('auth.basic', function(){ return Auth::basic('username');});
راه اندازی یک فیلتر اصلی HTTP بدون تابعیت
همچنین میتوانید از احراز هویت پایه HTTP بدون تنظیم کوکی شناسه کاربر در
جلسه استفاده کنید، که مخصوصاً برای احراز هویت API مفید است.
برای انجام این کار، فیلتری تعریف کنید که
onceBasic
متد را برمی گرداند:
Route::filter('basic.once', function(){ return Auth::onceBasic();});
اگر از PHP FastCGI استفاده می کنید، احراز هویت پایه HTTP به طور پیش فرض
به درستی کار نمی کند.
خطوط زیر باید به
.htaccess
فایل شما اضافه شود:
RewriteCond %{HTTP:Authorization} ^(.+)$RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
یادآوری رمز عبور و بازنشانی
مدل و میز
اکثر برنامه های کاربردی وب راهی را برای کاربران فراهم می کنند تا رمزهای
عبور فراموش شده خود را بازنشانی کنند.
لاراول به جای اینکه شما را مجبور به اجرای مجدد آن در هر برنامه کند، روش
های مناسبی برای ارسال یادآوری رمز عبور و انجام بازنشانی رمز عبور ارائه می دهد.
برای شروع، بررسی کنید که
User
مدل شما
Illuminate\Auth\Reminders\RemindableInterface
قرارداد را اجرا می کند.
البته،
User
مدل ارائه شده با فریم ورک از قبل این رابط را پیادهسازی میکند و از آن
Illuminate\Auth\Reminders\RemindableTrait
برای گنجاندن روشهای مورد نیاز برای پیادهسازی رابط استفاده میکند.
پیاده سازی RemindableInterface
use Illuminate\Auth\Reminders\RemindableTrait;use Illuminate\Auth\Reminders\RemindableInterface; class User extends Eloquent implements RemindableInterface { use RemindableTrait; }
ایجاد مهاجرت جدول یادآوری
در مرحله بعد، باید جدولی برای ذخیره رمزهای بازنشانی رمز عبور ایجاد شود.
برای ایجاد یک مهاجرت برای این جدول، به سادگی
auth:reminders-table
دستور Artisan را اجرا کنید:
php artisan auth:reminders-table php artisan migrate
کنترلر یادآور رمز عبور
اکنون ما آماده تولید کنترلر یادآور رمز عبور هستیم.
برای تولید خودکار یک کنترلر، می توانید از
auth:reminders-controller
دستور Artisan استفاده کنید که یک فایل در
فهرست
RemindersController.php
شما ایجاد می کند.
app/controllers
php artisan auth:reminders-controller
کنترلر تولید شده از قبل دارای
getRemind
روشی است که فرم یادآوری رمز عبور شما را نشان می دهد.
تنها کاری که باید انجام دهید این است که
با ایجاد یک فایل
در دایرکتوری، یک
password.remind
الگو
ایجاد کنید .
این نما باید یک فرم اولیه با یک
فیلد داشته باشد.
فرم باید به
عمل ارسال شود.
remind.blade.php
app/views/password/
email
RemindersController@postRemind
یک فرم ساده در
password.remind
نما ممکن است به شکل زیر باشد:
<form action="{{ action('RemindersController@postRemind') }}" method="POST"> <input type="email" name="email"> <input type="submit" value="Send Reminder"></form>
علاوه بر
getRemind
, کنترل کننده تولید شده قبلاً روشی دارد
postRemind
که ارسال ایمیل های یادآور رمز عبور را به کاربران شما انجام می دهد.
این روش انتظار دارد
email
که فیلد در متغیرها وجود داشته باشد
POST
.
اگر ایمیل یادآور با موفقیت برای کاربر ارسال شود، پیامی
status
به جلسه فلش می شود.
اگر یادآوری ناموفق باشد، یک
error
پیام به جای آن فلش می شود.
در
postRemind
روش کنترلر می توانید نمونه پیام را قبل از ارسال به کاربر تغییر دهید:
Password::remind(Input::only('email'), function($message){ $message->subject('Password Reminder');});
کاربر شما یک ایمیل با پیوندی دریافت می کند که به
getReset
روش کنترلر اشاره می کند.
رمز یادآوری رمز عبور، که برای شناسایی تلاش برای یادآوری رمز عبور استفاده
میشود، به روش کنترلر نیز ارسال میشود.
این اکشن قبلاً برای بازگرداندن
password.reset
قالبی که باید بسازید پیکربندی شده است.
token
به view ارسال می شود، و شما باید این نشانه را در یک فیلد فرم مخفی به نام
قرار
دهید
token
.
علاوه بر
token
فرم بازنشانی رمز عبور شما باید دارای فیلدهای
email
،
password
و نیز باشد
password_confirmation
.
فرم باید به
RemindersController@postReset
روش POST شود.
یک فرم ساده در
password.reset
نما ممکن است به شکل زیر باشد:
<form action="{{ action('RemindersController@postReset') }}" method="POST"> <input type="hidden" name="token" value="{{ $token }}"> <input type="email" name="email"> <input type="password" name="password"> <input type="password" name="password_confirmation"> <input type="submit" value="Reset Password"></form>
در نهایت،
postReset
متد مسئول تغییر رمز عبور در حافظه است.
در این عمل کنترلر، Closure که به متد ارسال میشود،
ویژگی را روی آن
Password::reset
تنظیم میکند
و
متد را فراخوانی میکند.
البته، این Closure با این فرض است که
مدل شما یک
مدل Eloquent
است .
با این حال، شما آزاد هستید که این بسته را در صورت نیاز تغییر دهید تا با
سیستم ذخیره سازی پایگاه داده برنامه شما سازگار باشد.
password
User
save
User
اگر رمز عبور با موفقیت بازنشانی شود، کاربر به ریشه برنامه شما هدایت می
شود.
باز هم، شما آزاد هستید که این URL تغییر مسیر را تغییر دهید.
اگر بازنشانی رمز عبور ناموفق باشد، کاربر به فرم بازنشانی هدایت میشود و
error
پیامی به جلسه فلش میشود.
اعتبارسنجی رمز عبور
بهطور پیشفرض، این
Password::reset
روش تأیید میکند که گذرواژهها مطابقت دارند و >= شش کاراکتر هستند.
شما می توانید این قوانین را با استفاده از
Password::validator
روشی که بسته شدن را می پذیرد، سفارشی کنید.
در این بسته شدن، میتوانید هر اعتبار رمز عبوری را که میخواهید انجام
دهید.
توجه داشته باشید که لازم نیست تأیید کنید که رمزهای عبور مطابقت دارند،
زیرا این کار به طور خودکار توسط فریمورک انجام می شود.
Password::validator(function($credentials){ return strlen($credentials['password']) >= 6;});
توجه: به طور پیش فرض، رمزهای بازنشانی رمز عبور پس از یک ساعت منقضی می شوند. می توانید این مورد را از طریق
reminder.expire
گزینه فایل خود تغییر دهیدapp/config/auth.php
.
رمزگذاری
لاراول امکاناتی را برای رمزگذاری قوی AES از طریق پسوند mcrypt PHP فراهم می کند:
رمزگذاری یک مقدار
$encrypted = Crypt::encrypt('secret');
توجه: حتماً یک رشته تصادفی 16، 24 یا 32 کاراکتری را در
key
گزینهapp/config/app.php
فایل تنظیم کنید. در غیر این صورت، مقادیر رمزگذاری شده ایمن نخواهند بود.
رمزگشایی یک مقدار
$decrypted = Crypt::decrypt($encryptedValue);
تنظیم رمز و حالت
همچنین می توانید رمز و حالت استفاده شده توسط رمزگذار را تنظیم کنید:
Crypt::setMode('ctr'); Crypt::setCipher($cipher);
درایورهای احراز هویت
لاراول درایورها
database
و
eloquent
احراز هویت را خارج از جعبه ارائه می دهد.
برای اطلاعات بیشتر در مورد افزودن درایورهای احراز هویت اضافی، مستندات
برنامه افزودنی احراز هویت را
بررسی کنید
.