لارافيل, Others / 2024-09-08

كيف يمكن عمل حظر لتسجيل دخول المستخدمين مع مدة زمنية لفك الحظر في لارافيل?

كيف يمكن عمل حظر لتسجيل دخول المستخدمين مع مدة زمنية لفك الحظر في لارافيل?

2024-09-08 وقت القراءه : 3 دقائق

يعتبر نظام تسجيل الدخول Auth System في لارافيل من أسهل الأدوات التي يوفرها إطار العمل، وتحتوي على الكثير من المميزات الرائعة، لكنها لا تحتوي على ميزة حجب المستخدم من الدخول لمدة زمنية معينة، في هذا المقال سوف نتطرق لكيفية إضافة هذه الخاصية في نظام التسجيل الخاص بنا. وذلك بإستخدام middleware و إضافة حقل جديد مثلا بإسم banned_until إلى جدول users.


الخطوات

إضافة حقل banned_until 

في جدول المستخدمين نقوم بإضافة حقل مثلا بإسم banned_unitl تكون القيمة الإفتراضية له null، وإذا أردنا حجب مستخدم نقوم من خلال لوحة التحكم أو بشكل تلقائي بإضافة تاريخ معين أكبر من تاريخ اليوم نحدد به تاريخ فك الحجب.

php artisan make:migration add_banned_until_to_users_table
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->timestamp('banned_until')->nullable();
    });
}
php artisan migrate

إضافة banned_until إلى الدالة $fillable في User Model.

protected $fillable = [
    'name', 'email', 'password', 'banned_until'
];

إضافة banned_until إلى الدالة $dated في User Model 

وذلك لأننا نحتاج لإستخدام بعض عمليات Carbon لحساب الأيام المتبقية حتى يتم فك الحظر.

protected $dates = [
    'banned_until'
];


إنشاء middleware

نحتاج لإنشاء middleware لفحص هل المستخدم تحت الحظر أم لا

php artisan make:middleware CheckBanned
public function handle(Request $request, Closure $next)
{
    if (Auth::check() && Auth::user()->banned_until && now()->lessThan(Auth::user()->banned_until)) {
        $banned_days = now()->diffInDays(Auth::user()->banned_until);
        Auth::logout();


        if ($banned_days) {
            $message = 'Your account has been suspended for '.$banned_days.' '.Str::plural('day', $banned_days).'. Please contact administrator.';
        }

        return redirect()->route('login')->withMessage($message);
    }
    return $next($request);
}

توضيح

  • بداية نتحقق من أن المستخدم مسجل دخول authenticated ومن ثم نتحقق إذا كان الحقل banned_until ليس فارغ، وأذا كان ليس فارغ ان يكون تاريخ اليوم أقل من تاريخ فك الحظر.
  • اذا تحقق الشرط أعلاه نقوم بحساب الأيام المتبقية لفك الحظر، والقيام بعملية تسجيل الخروج، وإظهار رسالة تحتوي على عدد الأيام المتبقية لفك الحظر.
  • أما إذا لم يتحقق الشرط (ان المستخدم ليس محظور، أو أن تاريخ اليوم أكبر من تاريخ فك الحظر)، فسوف يتم تنفيذ الطلب بنجاح.


تسجيل middlewrare

في الملف appp/Http/Kernel.php نقوم بتسجيل middleware

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,

        // ... other middleware classes

        \App\Http\Middleware\CheckBanned::class,
    ],


فورم تسجيل الدخول مع رسالة الخطأ

<div class="card" style="width: 500px; margin: 100px auto">
    <div class="card-header">
        Login
        @if (session('message'))
            <div class="alert alert-danger">{{ session('message') }}</div>
        @endif
    </div>
    <div class="card-body">
        <form method="post" action="{{ route('submit-login') }}">
            @csrf
            <table class="table">
                <tr>
                    <td>Email: </td>
                    <td>
                        <input type="email" class="form-control" name="email">
                    </td>
                </tr>
                <tr>
                    <td>Password </td>
                    <td>
                        <input type="password" class="form-control" name="password"/>
                    </td>
                </tr>
                <tr>
                    <td colspan="2"><input class="btn btn-primary" type="submit" name="add" value="Login"/> </td>
                </tr>
            </table>
        </form>
    </div>
</div>


إضافة route في ملف web.php

Route::post('/login',[LoginController::class,'index'])->name('submit-login');
Route::get('/dashboard',function (){
    return view('dashboard');
})->name('dashboard');

توضيح

  • الراوت الأول لتنفيذ عملية تسجيل الدخول.
  • الراوت الثاني لتوجيه المستخدم بعد تسجيل الدخول، لكن middleware سوف يفحص هل المستخدم تحت الحجب أم لا، إن كان تحت الحجب سيتم عمل تسجيل خروج له وإعادة توجيهه لصفة تسجيل الدخول مع رسالة خطأ بمدة الحجب المتبقي.
  • ان لم يكن تحت الحجب سيتم توجيهه لصفحة dashboard.


دالة تسجيل الدخول

class LoginController extends Controller
{
    public function index(Request $request){
        $credentials = $request->only('email', 'password');


        if (Auth::attempt($credentials)) {
            return redirect()->intended('dashboard');
        }else{
            return back()->withMessage('Please Check Your Email and Password');
        }
    }
}

كما يمكن أيضا إضافة ميزة من خلال لوحة التحكم بأن يتحكم الإداري بفك الحظر بشكل يدوي.



التعليقات
زائر
منذ سنتين

لم يتم اضافة middleware في الروات ولا في الدالة .. يبدوا انك نسيتها .. لكن المقال جميل جدا ومفيد

mark michil
منذ سنتين

very useful

Youssef
منذ سنتين

عمل ممتاز

nsem
منذ سنتين

السلام عليكم ممكن التحدث عن موضوع (role,permission)authorization بشكل موسع لانها مشكلة يواجهها الكثير بسبب عدم الفهم الصحيح اذا اممكن ولك الشكر الموصول لما تقدمه وسوف تقدمه

إضافة تعليق
Loading...