ahmadajah03 Thu Jan 2021 1 year ago

Contoh Membuat Ban, Suspend atau Block dan Unban Auth User Laravel

Para pengrajin yang terhormat, terkadang kami perlu melarang pengguna dari aplikasi kami. Ini fitur penting. Autentikasi Laravel menyediakan banyak fungsi. Sayangnya, mereka tidak menyediakan opsi ban / unban. Pada artikel ini, saya akan membuat fitur ban & unban. Saya sedang menguji di Laravel 8.22.1 .

Tambahkan Kolom ke Tabel Users

Pertama, kita perlu menambahkan kolom ke tabel users yang disebut banned_till . Jalankan perintah ini untuk membuat file migrasi untuk membuat kolom baru:

php artisan make:migration add_banned_till_to_users_table

Kemudian buka file migrasi dari database/migrations dan update up() metode seperti ini:

timestamp_add_banned_till_to_users_table.php

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

    // --- REST CODE
}

Kemudian buka Model pengguna dari directory app/Models  dan perbarui $fillable array seperti:

User.php

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

Sekarang migrasikan migrations:

php artisan migrate:fresh

Buat Middleware

Kami membutuhkan middleware untuk memeriksa auth pengguna dilarang atau tidak. Jalankan perintah ini untuk membuat middleware:

php artisan make:middleware IsUserBanned

Buka middleware IsUserBanned dari path app/Http/Middleware. Kemudian tempel kode ini:

IsUserBanned .php

<?php

namespace App\Http\Middleware;

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

class IsUserBanned
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (auth()->check() && auth()->user()->banned_till != null) {

            if (auth()->user()->banned_till == 0) {
                $message = 'Your account has been banned permanently.';
            }
            if (now()->lessThan(auth()->user()->banned_till)) {
                $banned_days = now()->diffInDays(auth()->user()->banned_till) + 1;
                $message = 'Your account has been suspended for ' . $banned_days . ' ' . Str::plural('day', $banned_days);
            }

            auth()->logout();
            return redirect()->route('login')->with('message', $message);
        }

        return $next($request);
    }
}

Sekarang mari daftarkan middleware kita ke file app/Http/Kernel.php. Di file Kernel, ada grup bernama $middlewareGroups. Kami harus mengatur jalur middleware kami ke grup web seperti:

Kernel.php

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        // --- MORE
        \App\Http\Middleware\IsUserBanned::class,
    ],

    // --- REST CODE
];

Middleware kami berhasil terdaftar.

Perbarui File Login Balde

Kita harus menambahkan div alert ke file resources/views/auth/login.blade.php:

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') }}">
    @csrf
    <!-- ... -->
  </form>

</div>

<!-- ... -->

Cekal Pengguna / User

Kami telah menyelesaikan semua langkah yang diperlukan. Sekarang mari kita cekal pengguna. Kita perlu menyetel nilai timestamp sebagai nilai bidang banned_till . Lihat contohnya:

use App\Models\User;
use Carbon\Carbon;

public function ban()
{
    // ban for days
    $ban_for_next_7_days = Carbon::now()->addDays(7);
    $ban_for_next_14_days = Carbon::now()->addDays(14);
    $ban_permanently = 0;

    // ban user
    $user_id = 1;
    $user = User::find($user_id);
    $user->banned_till = $ban_for_next_7_days;
    $user->save();
}

Jika kita ingin mencekal pengguna secara permanen , kita harus menyetel nilai bidang banned_till ke 0 (nol).

Periksa Status Banned

Kami dapat dengan mudah memeriksa status dilarang pengguna. Berikut contohnya:

use App\Models\User;
use Illuminate\Support\Str;

public function bannedStatus()
{
    $user_id = 1;
    $user = User::find($user_id);

    $message = "The user is not banned";
    if ($user->banned_till != null) {
        if ($user->banned_till == 0) {
            $message = "Banned Permanently";
        }

        if (now()->lessThan($user->banned_till)) {
            $banned_days = now()->diffInDays($user->banned_till) + 1;
            $message = "Suspended for " . $banned_days . ' ' . Str::plural('day', $banned_days);
        }
    }

    dd($message);
}

Batalkan Pelarangan Pengguna / User

Untuk membatalkan pencekalan pengguna, kita harus menyetel nilai banned_till ke null .

use App\Models\User;

public function unban()
{
    $user_id = 1;
    $user = User::find($user_id);
    $user->banned_till = null;
    $user->save();
}

Keluaran

Coba lihat ouputsnya. Larangan selama 7 hari:

Dicekal secara permanen:

Itu saja, pengrajin. Terima kasih sudah membaca.🙂

laravel