Membuat Role Admin dan User dengan Middleware Laravel

By | 28 Juli 2021

Dalam sebuah sistem informasi, pembagian role atau peran setiap user adalah salah satu hal yang sangat penting. Dengan adanya pembagian role, keamanan data dalam sistem informasi akan lebih baik. Misalnya, dalam sistem informasi pembayaran SPP, role siswa hanya bisa melihat data pembayaran miliknya sendiri, dan melakukan pembayaran. Sedangkan role operator bisa melakukan verifikasi pembayaran siswa, menerbitkan penagihan SPP, membuat laporan, dan sebagainya. Kemudian role admin bisa memantau aktivitas dalam sistem informasi, seperti penambahan data, perubahan data, dan sebagainya. Jika diperlukan, bisa ditambahkan lagi role lain seperti kepala sekolah dan orang tua. Tentunya sesuai kebutuhan dan rancangan.

Pembagian role ini tentu sangat penting, kita tidak ingin kan seorang siswa bisa melihat data pembayaran siswa lain, atau malah mengubah data pembayaran?

Di dalam Laravel, kita bisa dengan mudah membagi role antar user. Salah satu caranya adalah menggunakan middleware. Dengan menggunakan middleware, sistem akan memverifikasi role user yang login. Jika rolenya sesuai, maka akan diizinkan mengakses, tetapi jika tidak sesuai, maka akan ditolak. Misalnya, seseorang ingin mengakses halaman: http://contoh.com/operator/data-pembayaran, maka middleware akan memeriksa apakah user yang mengakses tersebut mempunyai role operator atau jika. Jika benar, maka akan diizinkan masuk. Hal ini akan sangat berguna jika seseorang dengan jahil mengetikan URL di address bar.

Membuat Kolom Role di Tabel `users`

Disini saya mengamsumsikan Anda sudah mempunyai authentikasi dengan Laravel, baik menggunakan Laravel UI, Laravel Breeze, maupun package lain. Dan data user disimpan di tabel users.

Pertama, kita harus membuat kolom baru ditabel users, yaitu kolom role. Kolom ini merupakan penanda role dari user, nantinya bisa diisi dengan admin untuk role admin, operator untuk role operator, siswa untuk role siswa, dan role lain yang dibutuhkan. Buat migration baru dengan perintah berikut:

php artisan make:migration add_role_to_users_table

Kemudian pada method up() tambahkan schema berikut:

Schema::table('users', function (Blueprint $table) {
    $table->string('role', 16)->default('user')->after('password');
});

Jika sudah, jalankan migration dengan perintah php artisan migrate. Hasilnya, di tabel users terdapat kolom “role”, yang bisa diisi dengan role-role yang dibutuhkan.

Membuat Middleware

Selanjutnya, buat middleware baru dengan nama Role dengan perintah berikut:

php artisan make:middleware Role

Maka di folder app/Http/Middleware akan terdapat file baru dengan nama Role.php, disinilah kita akan melakukan pemeriksaan role user yang mengakses. Pada file ini, ubah method handle() sehingga menjadi seperti berikut:

public function handle(Request $request, Closure $next, $role)
    {
        if ($request->user()->role == $role) {
            return $next($request);
        }

        abort(403, 'Anda tidak memiliki hak mengakses laman tersebut!');
    }

Pada method handle() kita menambah parameter baru, yaitu $role yang nantinya akan diberikan argumen role user yang akan diperiksa. Pada kode diatas, jika user tidak memiliki role seperti yang diperiksa, maka akan ditampilkan pesan bahwa user tersebut tidak memiliki hak untuk mengakses lamana tersebut. Jika ingin mengalihkan user ke halaman login, gunakan kode berikut:

public function handle(Request $request, Closure $next, $role)
    {
        if ($request->user()->role == $role) {
            return $next($request);
        }

        return redirect()
            ->to(route('login'));
    }

Maka jika user tidak memiliki role seperti yang diperiksa, akan dialihkan ke halaman login. Anda bisa juga mengganti dengan route lain, atau pesan error yang lain.

Mendaftarkan Middleware ke Kernel

Supaya middleware yang baru saja dibuat bisa dikenali dan digunakan, kita perlu mendaftarkannya ke kernel. Caranya, buka file app/Http/Kernel.php dan pada properti $routeMiddleware tambahkan kode berikut:

'role' => \App\Http\Middleware\Role::class,

Sehingga properti $routeMiddleware akan menjadi seperti berikut:

 protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
        'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
        'role' => \App\Http\Middleware\Role::class,
    ];

Jika sudah, middleware tadi sudah siap digunakan.

Menambah Middleware Role ke Route

Selanjutnya, kita perlu menambahkan middleware ke route. Tujuannya adalah melindungi dan membagi route apa saja yang bisa diakses oleh role tertentu. Kita bisa menggunakan route group, atau memberikan middleware ke route yang spesifik. Berikut contoh penggunaan middleware tadi untuk route group dan route individu. Silahkan buka file routes/web.php

Route::middleware(['auth', 'role:operator'])->group(function () {
    Route::get('/operator', [OperatorController::class, 'index'])->name('operator');

    //semua route dalam grup ini hanya bisa diakses oleh operator
});

Route::middleware(['auth', 'role:siswa'])->group(function () {
    Route::get('/siswa', [SiswaController::class, 'index'])->name('siswa');

    //semua route dalam grup ini hanya bisa diakses siswa
});

Dalam potongan kode diatas, terdapat grup route yang hanya bisa diakses oleh operator dan grup route yang hanya bisa diakses oleh siswa. Silahkan tambahkan dan sesuaikan dengan kebutuhan.

Berikut contoh untuk memberikan middleware kepada route tertentu.

Route::get('/kepala-sekolah', [KepalaSekolahController::class, 'index'])->middleware(['auth', 'role:kepsek']);

Selanjutnya, Anda perlu mengisi kolom role di tabel users pada saat user mendaftar. Pada route diatas, hanya user dengan role kepsek yang bisa mengakses route diatas.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *