اذهب إلى المحتوى

السؤال

نشر

أريد إضافة خاصية منع المُستخدمين من تسجيل دخولهم إلى وقت أحدده، مثلا الأدمن يتلقى شكاوي بخصوص مستخدم معين او يُلاحظ انه يسيئ إستخدام التطبيق فيقوم بإيقاف حسابه إلى تاريخ يقوم بتحديده، و إذا قام المُستخدم في هذه الفترة بمحاولة الدخول لحسابه تظهر له رسالة أن حسابه مُتوقف لمدة 6 أيام او 10 أيام مثلا و بعد إنقضاء تلك المدة يتم تنشيط الحساب تلقائياً دون تدخل من الأدمن.

Recommended Posts

  • 1
نشر

يُمكن ذلك بإضافة حقل جديد لجدول المُستخدم banned_until و إستخدام middleware تعمل على منع المُستخدم من تسجيل الدخول إذا كان في فترة توقيف حسابه

  • إضافة الحقل banned_until إلى جدول المستخدمين:
php artisan make:migration add_banned_until_to_users_table

هذا الأمر سيُنشئ ملف تهجير يُمكننا من إضافة حقل جديد لجدول المستخدمين.

class AddBannedUntilToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->timestamp('banned_until')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('banned_until');
        });
    }
}

بعد ذلك نقوم بتنفيذ أمر التهجير:

php artisan migrate

هذا يعني أن المُستخدم إن كانت banned_until فارغة أي null فإن الحساب نشيط، اما إن كان بالحقل تاريخ مُستقبلي فإن الحساب قد تم إيقافه.

  • نضيف الحقل إلى مصفوفة fillable و مصفوفة dates في النموذج User و ذلك حتى نستطيع مُعاملة الحقل على أنه تاريخ:
class User extends Authenticatable
{
    protected $fillable = [
        'name', 'email', 'password', 'banned_until'
    ];

    protected $dates = [
        'banned_until'
    ];
}
  • نقوم بإنشاء middleware نُسميها CheckBanned بهذا الأمر:
php artisan make:middleware CheckBanned

سيتم إنشاء الmiddleware في المسار التالي app/Http/Middleware نقوم بفتح الملف و نُعدل على الدالة handle بالشكل التالي:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

class CheckBanned
{
  /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
  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();

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

تعمل الmiddleware على التحقق من أن المُصادقة تمت أي أن المستخدم أدخل بيانات صحيحة، و أن الحقل banned_until لهذا المُستخدم ليس فارغ و أن الحقل به تاريخ مُستقبلي: إذا تحققت هذه الشروط تقوم بحساب فارق الأيام بين التاريخ الحالي و تاريخ الإيقاف و تقوم بتسجيل خروج للمُستخدم و إعادة توجيهه إلى صفحة تسجيل الخروج مع تمرير الرسالة.

يُمكن تمرير رسالة مُختلفة بحسب عدد الأيام كأن نتحقق إن كان عدد الأيام أقل من 20 نعرض عدد الأيام و إذا كان عدد الأيام اكبر لا نعرض عدد الأيام. فقط نقول أن الحساب تم إيقافه و لا نذكر المدة. الأمر راجع لك في هذه النقطة.

  • يتبقى تسجيل هذه الmiddleware و يتم ذلك على مستوى الملف app/Http/Kernel.php في المصفوفة middlewareGroups داخل المصفوفة ذات المفتاح web:
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,

        // ... other middleware classes

        \App\Http\Middleware\CheckBanned::class, 
    ],
  • الآن نقوم بعرض الرسالة في حالة كانت موجودة على مستوى صفحة العرض login.blade.php:
<div class="card-body">

    @if (session('message'))
        <div class="alert alert-danger">{{ session('message') }}</div>
    @endif

    <form method="POST" action="{{ route('login') }}">
      
      
      ...

و هذه النتيجة:

banned.thumb.JPG.2f0a96608acd061e2c94a8044f6dce7d.JPG

  • 0
نشر

مرحبا @كمال محمودي
يمكنك اضافة column جديد لجدول الخاص ب Users وليكن block_date
كتابة هذا اﻷمر في terminal 
 

php artisan make:migration add_block_date_to_users_table --table=users
public function up()
{
    Schema::table('users', function($table) {
        $table->date('block_date')->nullable()); // dateTime also // nullable قيم سابقة لابد ان تكون null 
    }); 
}

and don't forget to add the rollback option:

public function down()
{
    Schema::table('users', function($table) {
        $table->dropColumn('block_date');
    });
}

ثم عمل condition بسيط  لو user له block_date و لا تساوي null تقوم بإظهار الرسالة له .
يمكنك استخدم القيمة المخزنة في block_date لكي تنبه مستخدم أن تم منعه لمدة معينة باستخدام block_date

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...