Kita akan membuat sistem hak akses untuk pengguna sehingga situs web kita punya tipe pengguna sebagai admin atau user biasa
Sebelumnya ini kita sudah menginstal authentication system menggunakan Laravel 9 Breeze , dan sudah memodifikasinya supaya masuk memakai username atau email
Membuat hak akses
Buat Model hak akses pengguna dan tambahkan option -m untuk sekaligus membuat file migrasi nya
php artisan make:model Role -m
didalam folder database/migrations , buka File: ./database/migrations/_create_roles_table.php* dan perbaharui CreateRolesTable class dengan kode dibawah ini:
class CreateRolesTable extends Migration
{
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('roles');
}
}
Kita buat hubungan many-to-many antara model User dan Role
Didalam User model // File: ./app/Models/User.php tambahkan baris kode :
public function roles()
{
return $this->belongsToMany(Role::class);
}
pada Role model // File: ./app/Role.php tambahkan baris kode:
public function users()
{
return $this->belongsToMany(User::class);
}
Bikin pivot table untuk mengasosiasikan tipe pengguna dengan hak aksesnya dengan membuat table role_user table pakai perintah dibawah ini:
php artisan make:migration create_role_user_table
Buka File: ./database/migrations/*_create_role_user_table.php update CreateRoleUserTable class pakai kode ini:
class CreateRoleUserTable extends Migration
{
public function up()
{
Schema::create('role_user', function (Blueprint $table) {
$table->increments('id');
$table->integer('role_id')->unsigned();
$table->integer('user_id')->unsigned();
});
}
public function down()
{
Schema::dropIfExists('role_user');
}
}
Jalankan seeders
php artisan make:seeder RoleTableSeeder php artisan make:seeder UserTableSeeder
In the database/seeds folder, open the RoleTableSeeder.php file and replace the contents with the following code:
// File: ./database/seeds/RoleTableSeeder.php
<?php
use AppModelsRole;
use IlluminateDatabaseSeeder;
class RoleTableSeeder extends Seeder
{
public function run()
{
$role_regular_user = new Role;
$role_regular_user->name = 'user';
$role_regular_user->save();
$role_admin_user = new Role;
$role_admin_user->name = 'admin';
$role_admin_user->save();
}
}
Buka File: ./database/seeds/UserTableSeeder.php ganti kodenya:
use IlluminateDatabaseSeeder;
use IlluminateSupportFacadesHash;
use App/Models/User;
use AppModels/Role;
class UserTableSeeder extends Seeder
{
public function run()
{
$admin = new User;
$admin->name = 'Web Administrator';
$admin->email = '[email protected]';
$admin->password = Hash::make('letmein');
$admin->save();
$admin->roles()->attach(Role::where('name', 'admin')->first());
$user = new User;
$user->name = 'Web User';
$user->email = '[email protected]';
$user->password = Hash::make('password');
$user->save();
$user->roles()->attach(Role::where('name', 'user')->first());
}
}
Buka File: ./database/seeds/DatabaseSeeder.php update public function run:
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call([
RoleTableSeeder::class,
UserTableSeeder::class,
]);
}
}
Buka File: ./app/Models/User.php. tambahkan method checkRoles yg berfungsi untuk memeriksa hak akses yg dimiliki pengguna.
public function checkRoles($roles)
{
if ( ! is_array($roles)) {
$roles = [$roles];
}
if ( ! $this->hasAnyRole($roles)) {
auth()->logout();
abort(404);
}
}
public function hasAnyRole($roles): bool
{
return (bool) $this->roles()->whereIn('name', $roles)->first();
}
public function hasRole($role): bool
{
return (bool) $this->roles()->where('name', $role)->first();
}
Buka File: app/HttpControllers/Auth/RegisteredUserController.php untuk membuat hak akses default sebagai pengguna biasa saat akun baru didaftarkan untuk pertama kali
protected function create(array $data)
{
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
$user->roles()->attach(AppRole::where('name', 'user')->first());
return $user;
}
Jalankan migrasi dan seeding
php artisan migrate:fresh --seed
Untuk testing buka file routesWeb.php Edit
Route::get('/dashboard', function () {
return Auth::user()->roles()->first()->name =='admin' ? view('dashboard') : abort(403);
})->middleware(['auth', 'verified'])->name('dashboard');
Saat pengguna masuk sebagai admin maka dia bisa masuk ke dashboard, selain itu maka akan forbiden
Video Tutorial