Assalamualaikum Warohmatulloh Wabarokatuh, memang banyak cara untuk membedakan level user pada aplikasi yang kita bangun dengan Laravel. Jika sebelumnya sudah sempat kita bahas tentang Laravel Multi Auth dengan menggunakan tabel berbeda. Kali ini kita akan belajar tentang konsep roles & permission menggunakan package Laravel Role & Permission.
Instal Laravel Roles & Permission
Karena kita menggunakan package, maka kita harus menginstal terlebih dulu. Ohya, saya asumsikan kawan-kawan sudah punya proyek Laravel yang masih baru & sudah melakukan konfigurasi untuk database dan sudah menjalankan auth scaffolding Laravel.
composer require spatie/laravel-permission
Setelah terinstal, langkah berikutnya adalah kita menerbitkan file migrations dari package ini.
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
Berikutnya, jalankan migrationnya.
php artisan migrate
Setelah dijalankan maka akan ada beberapa tabel yang dibuat oleh migration dari package ini.
Penggunaan
Pertama setelah melakukan proses instalasi. Untuk menggunakan package Laravel Permission ini kita tambahkan dulu trait HasRoles
ke model User
.
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasRoles;
// ...
}
Dalam tulisan ini, saya akan langsung berikan contoh praktikal yang biasa saya lakukan ketika membangun sebuah proyek yang membutuhkan pembagian level user.
Pertama, yang saya lakukan adalah membuat sebuah seeder untuk mendefinisikan roles apa saja yang tersedia dalam proyek nantinya.
php artisan make:seeder RoleSeeder
Setelah RoleSeeder
dibuat, selanjutnya buat kode seperti ini untuk mendefinisikan role yang kawan-kawan butuhkan. Pada contoh ini saya akan buat dua role yaitu admin dan user.
<?php
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
class RoleSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Role::create([
'name' => 'admin',
'guard_name' => 'web'
]);
Role::create([
'name' => 'user',
'guard_name' => 'web'
]);
}
}
Setelah membuat seeder untuk role, berikutnya kita akan buat 2 user dengan masing-masing role yang ada. Buat seeder untuk user.
php artisan make:seeder UserSeeder
Kemudian, tambahkan tulis kode ke dalam UserSeeder
seperti yang di bawah ini. Fungsinya untuk membuat user dan memberi sebuah role.
<?php
use App\User;
use Illuminate\Database\Seeder;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$admin = User::create([
'name' => 'Admin',
'email' => 'admin@kawankoding.id',
'password' => bcrypt('12345678'),
]);
$admin->assignRole('admin');
$user = User::create([
'name' => 'User',
'email' => 'user@kawankoding.id',
'password' => bcrypt('12345678'),
]);
$user->assignRole('user');
}
}
Setelah itu, untuk mempermudah proses seeding, panggil seeder yang dibuat tadi ke dalam class DatabaseSeeder
.
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(RoleSeeder::class);
$this->call(UserSeeder::class);
}
}
Perlu diperhatikan dalam memanggil seeder dahulukan RoleSeeder
, karena pada UserSeeder
ada proses assignRole
yang membutuhkan nilai dari data pada tabel roles
.
Kemudian, mari jalankan seedernya.
php artisan db:seed
Setelah seeder dijalankan maka akan ada 3 tabel yang terisi data. Yaitu tabel roles
, users
dan model_has_roles
.
Sedikit penjelasan tentang tabel model_has_roles
adalah model pivot untuk relasi Many to Many Polymorphic di Laravel. Intinya roles bisa digunakan dengan relasi ke model lainnya selain model User
. misal kawan-kawan punya model Admin
kita bisa juga gunakan trait HasRoles
di model Admin
.
Membedakan Redirect Ketika Login
Setelah punya data user yang memiliki role. Kebutuhan selanjutnya adalah memisahkan redirect user yang berhasil login sesuai role masing-masing.
Baiklah, mari kita buat route yang akan kita gunakan untuk redirect user berdasarkan role yang dimiliki. Sebelumnya, kita daftarkan dulu middleware dari spatie/laravel-permission
untuk melindungi route berdasarkan role.
Tambahkan middleware ke dalam file app/Http/Kernel.php
.
protected $routeMiddleware = [
// ...
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
];
Kemudian mari kita buat route di file routes/web.php
.
Route::get('admin-page', function() {
return 'Halaman untuk Admin';
})->middleware('role:admin')->name('admin.page');
Route::get('user-page', function() {
return 'Halaman untuk User';
})->middleware('role:user')->name('user.page');
Oke, sekarang waktunya kita beraksi, ada beberapa cara untuk melakukan pengecekan dan membedakan redirect dari user. Kita gunakan cara paling mudah dan yang biasa saya gunakan. Buka file app/Http/Controllers/Auth/LoginController.php
. Kemudian kita akan override method authenticated
yang ada di berada trait AuthenticatesUsers
. Oke, jadi tambahkan kode ini di LoginController
.
public function authenticated(Request $request, $user)
{
if ($user->hasRole('admin')) {
return redirect()->route('admin.page');
}
return redirect()->route('user.page');
}
Dan jangan lupa untuk menambahkan use Illuminate\Http\Request;
biar gak error :P.
Sudah selesai ? sekarang coba akses halaman login (http://localhost:8000/login) dan gunakan masing-masing data user untuk login.
Yaudah, ngapain lanjut baca? dirusuh nyoba kok malah baca :p. Praktekin tuh bisa nggak wkwkw. Percuma baca doang kalo ga dipraktekin :P.
Wassalamualaiikum Warrohmatulloh Wabarokatuh.
Kang roles buat service API gmn ? Biar bisa dikonsumsi sama frontend dan mobile apps.
bisa juga pakai ini kok , atau bikin manual
apa ga ada cara yg lebih efektif klo sperti itu cape juga jika harus define per role di setiap kondisi , klo role ada 10 akan banyak kodingan
harusnya bisa pakai array
terimakasih mas, membantu banget
Alhamdulillah, sama-sama mas
bedanya dengan fitur multi auth yang ini https://www.kawankoding.id/membuat-fitur-multi-auth-di-laravel-7/ apa ya? kira-kira kalau ingin membuat 3 roles lebih baik menggunakan yang mana? btw terima kasih mas tutorialnya sangat membantu
saya lebih prefer ke roles & permission kalau memang data usernya tidak banyak perbedaan. tujuannya sama, banyak caranya.
Assalamualaikum Mas. Mohon maaf saya ingin bertanya. Saya ingin membuat proyek toko online. Ada role customer, employee, dan admin.
Untuk customer hanya bisa masuk ke tampilan toko onlinenya, lalu untuk employee dan admin bisa masuk ke dashboard admin.Lebih baik pakai roles permission seperti ini atau pakai multi auth ya?
Terima kasih Mas.
Waalaikumsalam Warohmatulloh Wabarokatuh,
Kalau saya yang saya terapkan di Studi Kasus kelaslaravel.com saya gunakan Role & Permission mas.
Salam hormat mas,
aku pake laravel 7, –>
typeError
Argument 1 passed to Illuminate\Auth\EloquentUserProvider::validateCredentials() must be an instance of Illuminate\Contracts\Auth\Authenticatable, instance of App\Admin given
trim’s sebelumnya
aduch maaf salah comment di https://www.kawankoding.id/membuat-fitur-multi-auth-di-laravel-7/
mau pakai tabel admin ya? kalo iya class Admin harus extends ke Authenticable
berarti kalau diimplementasikan di form register, musti ditambahkan form baru yg nantinya akan diinputkan ke tabal model_has_roles ya mas ?
kalau register secara default biasanya kan rolenya user, kalau misal pada manajemen user bia ditambahkan dropdown untuk pilih rolenya, misal ada moderator, admin, user dll
mas ini harus bikin folder admin sama blade page dulu berarti ya baru bisa?
bebas untuk implementasinya, itu sebagai contoh 🙂
mas apakah dalam kelas kursus punya mas yang seperti ini diajarkan? saya butuh materi bantuan untuk membuat blog mas, jadi mau misahin hak akses admin, pengunjung sama writernya. mohon dijawab mas 🙂
sudah di balas di wa ya
bang alur routes setelah login gimana bang , maaf gamudeng
sudah ding bang heehe
apa kah bisa dibuat Route::group bang?
contohnya bang sekalian hehhe
bisa kok
model_has_permissions
permissions
role_has_permissions
itu semua table di database buat apa ya mas?
mau tanya bang, semisal kita ingin nampilkan user yang rolenya admin gimana yah ?
User::role(‘NamaRole’)->get();
makasih bang
bang aku udah berhasil login untuk user dan admin udah sesuai tapi aku coba buat user baru bukan buat di seedernya tapi langsung registrasi dan itu bisa masuk tapi setelah logout aku coba lagin dg user baru tadi tiba2 gk bisa dan ada keterangan seperti ini bang :
403User does not have the right roles.
mohon pencerahanya bang masih pemula hehehe..
oh iya belum ada di tulisannya ya, untuk register setelah create user tambahkan untuk assign role mirip di Seeder.
Misalnya :
$user->assignRole(‘user’);
taruh baris kode tersebut setelah user dibuat.
Halo mas amirul, saya mau ngeimplementasiin spati ini di project saya yang akan datang karena saya membuat laravel sebagai api, dan apakah ini cocok ya? oh iya mas kalau buat manualnya sendiri apakah sudah ada tutorialnya di kawankoding ya? Terima kasih
Cocok aja mas 🙂 , kalau pengaturan roles & permissionnya rumit, saya pilih pakai package sih mas 🙂 #programmerMalas
assslamualaikum mas,sya mau tanya untuk role login misal ada admin dan superadmin itu gmna ya mas…
seharusnya tinggal dibuat aja rolenya 🙂
kalau di laravel 8 mas?
sama aja
apakah ada perbedaan di laravel 8 mas?
hallo mas amirul
pada kernel.php terdapat problem ini.
Cannot redeclare App\Http\Kernel::$routeMiddleware.
hmm itu udah ada $routeMiddleware jgn ditulis ulang
Kenapa saya saat melakukan
Seeding: RoleSeeder
malah menemui error
Spatie\Permission\Exceptions\RoleAlreadyExists
A role `admin` already exists for guard `web`.
Solusinya gimana ya?
berarti datanya sudah ada, atau seedernya sudah pernah dijalankan 🙂
Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/DependencyResolver/RuleWatchGraph.php on line 52
kak saya pas install composer permissions error seperti itu kenapa yaa?
Halo mas, ini kan baru buat role nya aja ya? klo untuk premission nya gimana?
saya mau buat rolenya, admin dinas daftarkan user admin sekolah, kemudian user admin sekolah mendaftarkan user guru, yang perlu ditambahkan apanya pak
Kan itu datanya ambil dari UserSeeder, kalo mau ambil dari database yg sudah kita buat gimana mas Amirul? Maaf lagi bingung soalnya hehe
permisi mas, kenapa ya pas saya jalan kan projectnya berhasil login dengan menggunakan user dan admin, tapi kok pas baru login terus saya pencet tombol back kok malah ke tampilan home admin ya ? mohon pencerahannya mas
permisi mas, kenapa ya pas saya jalan kan projectnya berhasil login dengan menggunakan user dan admin, tapi kok pas baru login terus saya pencet tombol back kok malah ke tampilan home tampilan default laravel nya ya ? mohon pencerahannya mas
Bang, kalo diapliaksikan di Laravel Jetstream bisa juga bang ?
Bisa aja
halo mas izin tanya. kalau di routenya ini ingin bisa diakses oleh 2 role gimana ya penulisannya? misal ingin page user bisa diakses oleh user dan admin. saya sudah cobaubah di route nya dengan menambah role tapi masih eror. terima kasih
harusnya bisa ‘role:admin,user’