Kali ini kita akan belajar login roles permission menggunakan pake spatie
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.
sebelumnya konten ini hanya copas dari web ini : Belajar Laravel Roles & Permission : membedakan level user (kawankoding.id)
Terima Kasih.
Komentar
Posting Komentar