يعتبر نظام تسجيل الدخول Auth System في لارافيل من أسهل الأدوات التي يوفرها إطار العمل، وتحتوي على الكثير من المميزات الرائعة، لكنها لا تحتوي على ميزة حجب المستخدم من الدخول لمدة زمنية معينة، في هذا المقال سوف نتطرق لكيفية إضافة هذه الخاصية في نظام التسجيل الخاص بنا. وذلك بإستخدام middleware و إضافة حقل جديد مثلا بإسم banned_until إلى جدول users.
في جدول المستخدمين نقوم بإضافة حقل مثلا بإسم 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
protected $fillable = [ 'name', 'email', 'password', 'banned_until' ];
وذلك لأننا نحتاج لإستخدام بعض عمليات Carbon لحساب الأيام المتبقية حتى يتم فك الحظر.
protected $dates = [ 'banned_until' ];
نحتاج لإنشاء 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); }
توضيح
في الملف 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::post('/login',[LoginController::class,'index'])->name('submit-login'); Route::get('/dashboard',function (){ return view('dashboard'); })->name('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'); } } }
كما يمكن أيضا إضافة ميزة من خلال لوحة التحكم بأن يتحكم الإداري بفك الحظر بشكل يدوي.
very useful
عمل ممتاز
السلام عليكم ممكن التحدث عن موضوع (role,permission)authorization بشكل موسع لانها مشكلة يواجهها الكثير بسبب عدم الفهم الصحيح اذا اممكن ولك الشكر الموصول لما تقدمه وسوف تقدمه
زائر
لم يتم اضافة middleware في الروات ولا في الدالة .. يبدوا انك نسيتها .. لكن المقال جميل جدا ومفيد