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

تغییر رمز عبور کاربران در هر X روز در لاراول

الهه قنبری

توسط الهه قنبری

دیدگاه ها: 0
بازدید ها : 62
رایگان
هدف ما این است که شما، در بالاترین سطح طراحی و توسعه وب باشید.

ثبت نام کنید

در این مقاله کاربردی قصد داریم تا نحوه تغییر پسورد در لاراول به صورت منظم و در هر 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 به همراه کد

یافتن آدرس با مختصات به وسیله Google Maps API در لاراول

با پیاده سازی روش بالا در برنامه خود، اکنون می‌توانید کاربران خود را وادار کنید که پسورد خود را در هر ۳۰ روز یکبار تغییر دهند. امیداوارم این مقاله نیز برای شما مفید بوده باشد. با سایر مقالات لاراول ما در لیداوب همراه باشید.

5 از 1 رای

 مطالب مرتبط  

در قسمت زیر مطالبی وجود دارند که با مقاله فعلی مرتبط هستند



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

برترین مطالب

آموزش در لیداوب

از مقالات و ویدیو های آموزشی خودتان کسب درآمد کنید!

جدیدترین سرویس ما برای دوستان متخصص و خوش بیان در زمینه طراحی وب ارائه شد. این سرویس به شما این امکان را می دهد که به آسانی مقالات و یا ویدیو های آموزشی خود را در لیداوب منتشر کنید. فرصت مناسبی است که بدون داشتن وب سایت و یا وبلاگ و مهم تر از همه بدون هزینه، مطالب خود را در لیداوب منتشر کنید و مهم تر از همه با فروش آنها کسب درآمد کنید. همین حالا شروع کنید و این فرصت استثنایی را از دست ندهید.