در حال بارگزاری ...

تغییر کلمه عبور منقضی شده در لاراول

توسط الهام غایب
آخرین به روز رسانی جمعه 04 مهر 1399

در برخی از سیستم‌ها مانند بخش بانکی یا کار با داده‌های حساس لازم است هر X روز یکبار، کلمه عبور یا پسورد تغییر داده شود. لاراول این قابلیت را ندارد اما می‌توان خیلی راحت آن را ایجاد کرد.

در برخی از سیستم‌ها مانند بخش بانکی یا کار با داده‌های حساس لازم است هر X روز یکبار، کلمه عبور یا پسورد تغییر داده شود. لاراول این قابلیت را ندارد اما می‌توان خیلی راحت آن را ایجاد کرد. در این مقاله از لیداوب همراه ما باشید تا با نحوه انجام این کار آشنا شوید.


منظور از تغییر پسورد این است که پس از گذشت مدت زمان مشخصی، پسورد قبلی منقضی شده و کاربر با صفحه «کلمه عبور منقضی شده است» رو به رو می‌شود:

تغییر کلمه عبور منقضی شده در لاراول

تغییر پسورد (password) منقضی شده در لاراول

برای ایجاد این قابلیت در لاراول باید مراحل زیر را دنبال کنید:

۱. افزودن timestamp با عنوان "password_changed_at" در جدول دیتابیس users

۲. ایجاد صفحه‌ای که کاربر را به سمت عوض کردن پسورد هدایت کند: route/controller/view

۳. فرآیند تغییر پسورد و تایید اعتبار پسورد فعلی و پسورد جدید

۴. ایجاد یک middleware برای بررسی منقضی شدن پسورد (در X روز)

۵. افزودن middleware به Http Kernel و Routes

۶.  ایجاد تنظیمات تعداد روزها از فایل config

افزودن فیلد Password_changed_at به جدول users

ابتدا، مایگریشن زیر را ایجاد می‌کنیم:

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'
    ];

 ایجاد صفحه تغییر پسورد

می‌توان گفت تقریبا صفحه فعلی تغییر پسورد را در یک ساختار MVC کپی و پیست می‌کنیم:

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';
});

می‌خواهیم آن را در auth و Route Group قرار دهیم:

Route::middleware(['auth'])->group(function () {
    Route::get('/dashboard', function () {
        return 'See dashboard';
    });
});

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

در اصل، ما چک می‌کنیم ببینیم ایا پسورد تغییر کرده است (در غیر این صورت از users.created_at استفاده می‌کنیم) و اگر پسورد از ۳۰ روز قدیمی‌تر بود، صفحه تغییر پسورد که در بالا ایجاد کردیم را به کاربر نشان می‌دهیم. برای اجرای این middleware، باید آن را در app/http/kernel.php ثبت کنیم:

    protected $routeMiddleware = [
        // ... previous list
        'password_expired' => \App\Http\Middleware\PasswordExpired::class,
    ];

آخرین کاری که باید انجام دهیم ایجاد تنظیمات ۳۰ روزه است. فقط کافی است یک پارامتر به آرایه فایل ‌config اضافه کنیم، ما 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')) {

دوره‌های آموزش طراحی سایت در لیداوب:

آموزش پایه لاراول

آموزش CSS

آموزش HTML مقدماتی

با این آموزش ساده می‌توانید کاربران خود را به تغییر کلمه عبور یا پسورد خود در هر ۳۰ روز ملزم کنید. امیدوارم این آموزش نیز برای شما مفید باشد. اگر قصد یادگیری طراحی سایت حرفه‌ای با PHP را دارید، مقالات کاربردی و دوره‌های آموزشی لیداوب شما در رسیدن به این هدف یاری می‌کند. همچنین، اگر در هر یک از زمینه‌های طراحی وب و برنامه نویسی موبایل مهرات کافی دارید، می‌توانید از امکان ارائه و فروش محصولاتتان که در لیداوب برای شما فراهم شده است، بهره ببرید. برای اطلاعات بیشتر می‌توانید این صفحه را مطالعه نمایید.

دیدگاه ها

دیدگاه ها : 0


متاسفانه فقط اعضای سایت قادر به ثبت دیدگاه هستند

رایگان

اشتراک گذاری در
سورس خرید و فروش ارزهای دیجیتال
ثبت امتیاز
0.7 (3 رای)

   لطفا صبر کنید ...