تغییر رمز عبور کاربران در هر X روز در لاراول
در این مقاله کاربردی قصد داریم تا نحوه تغییر پسورد در لاراول به صورت منظم و در هر X روز را به شما آموزش دهیم. با لیداوب همراه باشید.
در برخی از سیستمها مانند سیستم بانکی یا در هنگام کار با دادههای خیلی حساس، نیاز است که در هر X روز، رمز عبور یا پسورد کاربران تغییر داده شود. لاراول قابلیت تغییر پسورد در هر X روز را به صورت پیشفرض در خود ندارد ولی پیاده سازی انجام این کار در این فریم ورک بسیار راحت است. با ادامه مقاله همراه ما باشید.
در اینجا، صفحه رمز عبور منقضی شده (expired password) را مشاهده میکنید. کاربری که پسوردش منقضی شده است در هنگام ورود به سیستم این صفحه را مشاهده خواهد کرد:
مراحل تغییر پسورد کاربران در هر X روز در لاراول
برای ایجاد قابلیت تغییر پسورد در هر X روز در لاراول، باید مراحل زیر را طی کنیم:
1. اضافه کردن فیلد timestamp به نام password_changed_at
به جدول users
در پایگاه داده
2. ساخت یک صفحه برای ایجاد امکان زمانبندی تغییر پسورد: route / controller / view
3. انجام عملیات اعتبارسنجی بر روی پسورد فعلی و پسوردهای جدید
4. ایجاد یک middleware برای بررسی اینکه آیا پسورد منقضی شده است یا خیر
5. اضافه کردن این middleware به Http Kernel و مسیرها
6. تنظیم مقدار X روز در فایل پیکربندی
مرحله اول: اضافه کردن فیلد Password_changed_at
ابتدا، مایگریشن زیر را اضافه میکنیم:
class AddPasswordChangedAtToUsers extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->timestamp('password_changed_at')->nullable();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('password_changed_at');
});
}
}
سپس، باید آن را به صورت زیر پر کنیم، برای این کار باید app/User.php
را ویرایش کنیم:
class User extends Authenticatable
{
protected $fillable = [
'name', 'email', 'password', 'password_changed_at'
];
مرحله دوم: ساخت صفحه تنظیم مجدد پسورد
:routes/web.php
Route::get('password/expired', 'Auth\[email protected]')
->name('password.expired');
ایجاد کنترلر جدید
:app/Http/Controllers/Auth/ExpiredPasswordController.php
class ExpiredPasswordController extends Controller
{
public function expired()
{
return view('auth.passwords.expired');
}
اضافه کردن ویو جدید
:resources/views/auth/password/expired.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Reset Password</div>
<div class="panel-body">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
<a href="/">Return to homepage</a>
@else
<div class="alert alert-info">
Your password has expired, please change it.
</div>
<form class="form-horizontal" method="POST" action="{{ route('password.post_expired') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('current_password') ? ' has-error' : '' }}">
<label for="current_password" class="col-md-4 control-label">Current Password</label>
<div class="col-md-6">
<input id="current_password" type="password" class="form-control" name="current_password" required="">
@if ($errors->has('current_password'))
<span class="help-block">
<strong>{{ $errors->first('current_password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
<label for="password" class="col-md-4 control-label">New Password</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control" name="password" required="">
@if ($errors->has('password'))
<span class="help-block">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('password_confirmation') ? ' has-error' : '' }}">
<label for="password-confirm" class="col-md-4 control-label">Confirm New Password</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required="">
@if ($errors->has('password_confirmation'))
<span class="help-block">
<strong>{{ $errors->first('password_confirmation') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Reset Password
</button>
</div>
</div>
</form>
@endif
</div>
</div>
</div>
</div>
</div>
@endsection
در اینجا، عملیات تغییر پسورد را پیاده سازی میکنیم. درخواست POST به مسیر password.post_expired
میرود.
:routes/web.php
Route::post('password/post_expired', 'Auth\[email protected]')
->name('password.post_expired');
:ExpiredPasswordController.php
use App\Http\Requests\PasswordExpiredRequest;
use Carbon\Carbon;
use Illuminate\Support\Facades\Hash;
class ExpiredPasswordController extends Controller
{
public function postExpired(PasswordExpiredRequest $request)
{
// Checking current password
if (!Hash::check($request->current_password, $request->user()->password)) {
return redirect()->back()->withErrors(['current_password' => 'Current password is not correct']);
}
$request->user()->update([
'password' => bcrypt($request->password),
'password_changed_at' => Carbon::now()->toDateTimeString()
]);
return redirect()->back()->with(['status' => 'Password changed successfully']);
}
همانطور که متوجه شدید، برای انجام عملیات اعتبارسنجی در تغییر پسورد، یک کلاس Request
جداگانه در app/Http/Requests/PasswordExpiredRequest.php
ایجاد میکنیم:
class PasswordExpiredRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'current_password' => 'required',
'password' => 'required|confirmed|min:6',
];
}
}
مطالعه مقاله مرتبط:
مرحله سوم: اضافه کردن یک Middleware برای بررسی اینکه پسورد منقضی شده یا خیر
اکنون، ما یک صفحه برای تغییر پسورد منقضی شده داریم و پس از تغییر پسورد، فیلد password_changed_at
را تنظیم میکنیم. اکنون، زمانی که پسورد تنظیم مجدد شده است و زمان واقعی استفاده از آن فیلد را چک میکنیم.
فرض کنیم که کاربر پس از ورود به سیستم، به داشبورد میرود:
Route::get('/dashboard', function () {
return 'See dashboard';
});
حالا باید آن را در middleware auth
و مسیر Group قرار دهیم:
Route::middleware(['auth'])->group(function () {
Route::get('/dashboard', function () {
return 'See dashboard';
});
});
حال باید مسیرهای قبلی را نیز تحت عنوان auth
اضافه کنیم، زیرا شما میتوانید پسورد خود را فقط در صورتی که وارد سیستم شوید، تغییر دهید.
بنابراین، به صورت زیر عمل میکنیم:
Route::middleware(['auth'])->group(function () {
Route::get('/dashboard', function () {
return 'See dashboard';
});
Route::get('password/expired', 'Auth\[email protected]')
->name('password.expired');
Route::post('password/post_expired', 'Auth\[email protected]')
->name('password.post_expired');
});
مرحله آخر، معرفی middleware برای بررسی پسورد منقضی شده است. این معرفی باید در تمام صفحات داخلی انجام شود. در حال حاضر ما فقط داشبورد را داریم:
:routes/web.php
Route::middleware(['auth'])->group(function () {
Route::middleware(['password_expired'])->group(function () {
Route::get('/dashboard', function () {
return 'See dashboard';
});
});
Route::get('password/expired', 'Auth\[email protected]')
->name('password.expired');
Route::post('password/post_expired', 'Auth\[email protected]')
->name('password.post_expired');
});
حالا، middleware خود را با دستور زیر را ایجاد میکنیم:
php artisan make:middleware PasswordExpired
و سپس app/Http/Middleware/PasswordExpired.php
را به صورت زیر پر میکنیم:
namespace App\Http\Middleware;
use Carbon\Carbon;
use Closure;
class PasswordExpired
{
public function handle($request, Closure $next)
{
$user = $request->user();
$password_changed_at = new Carbon(($user->password_changed_at) ? $user->password_changed_at : $user->created_at);
if (Carbon::now()->diffInDays($password_changed_at) >= 30) {
return redirect()->route('password.expired');
}
return $next($request);
}
}
در هنگام پیاده سازی عملیات تغییر پسورد (البته در صورت وجود کاربر، در غیر این صورت ما باید user.created_at
را بررسی کنیم) باید تعداد روزها را بررسی کنیم؛ در صورتی که تعداد آن بیشتر از 30 روز باشد، ما به صفحه پسورد منقضی شده یا password expired هدایت میشویم که در قسمتهای بالاتر ایجاد کردهایم.
برای اینکه middleware ما به درستی کار کند، باید آن را در app/Http/Kernel.php
ثبت کنیم:
protected $routeMiddleware = [
// ... previous list
'password_expired' => \App\Http\Middleware\PasswordExpired::class,
];
مرحله نهایی در این عملیات این است که قابلیت تنظیم تعداد روزها را ایجاد کنیم. برای انجام این کار، ما فقط نیاز به اضافه کردن یک پارامتر به یک فایل کانفیگ داریم. ما config / auth.php
را انتخاب کرده و خط زیر را به آن اضافه میکنیم:
return [
// ... all other config values
'password_expires_days' => 30,
];
پس از آن، middleware خود را ویرایش میکنیم تا از این مقدار استفاده کند، برای مثال به جای کد زیر:
if (Carbon::now()->diffInDays($password_changed_at) >= 30) {
میتوانیم از کد زیر استفاده کنیم:
if (Carbon::now()->diffInDays($password_changed_at) >= config('auth.password_expires_days')) {
مطالعه مقالات آموزشی بیشتر در لیداوب:
مدیریت منطقه های زمانی (timezone) کاربر در لاراول
ایجاد notification با استفاده از لاراول و Pusher به همراه کد
با پیاده سازی روش بالا در برنامه خود، اکنون میتوانید کاربران خود را وادار کنید که پسورد خود را در هر ۳۰ روز یکبار تغییر دهند. امیداوارم این مقاله نیز برای شما مفید بوده باشد. با سایر مقالات لاراول ما در لیداوب همراه باشید.
متاسفانه فقط اعضای سایت قادر به ثبت دیدگاه هستند
دیدگاه ها 0