نسخه:

امنیت

پیکربندی

لاراول قصد دارد پیاده سازی احراز هویت را بسیار ساده کند. در واقع، تقریباً همه چیز خارج از جعبه برای شما پیکربندی شده است. فایل پیکربندی احراز هویت در آدرس قرار دارد 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 احراز هویت را خارج از جعبه ارائه می دهد. برای اطلاعات بیشتر در مورد افزودن درایورهای احراز هویت اضافی، مستندات برنامه افزودنی احراز هویت را بررسی کنید .