Membuat batasan kepada pengguna untuk setiap halaman yang di khususkan, atau halaman yang bisa / boleh dibuka atau tidak bisa dibuka oleh user sangatlah penting.
Kita bisa malakukannya dengan membuat role, dimana akan memproteksi halaman dan melakukan tindakan sepeti mengalihkan ke halaman lain ketika role user tidak sesuai.
Contoh Sederhana Role Users dengan Laravel
Berikut langkah-langkah untuk membuat role users dengan laravel:
1. Install Laravel
Langkah pertama, kita install laravel terlebih dahulu.
~ composer create-project --prefer-dist laravel/laravel laravelRoleUsers ~ cd laravelRoleUsers
atau
~ laravel new laravelRoleUsers ~ cd laravelRoleUsers
2. Pengaturan Database
Silahkan membuat database baru di MySQL dan hubungkan dengan project.
//.env ... DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=db_laravelRoleUsers DB_USERNAME=root DB_PASSWORD= ...
3. Membuat Tabel
Selanjutnya membuat tabel. Kita buat 2 file migrasi untuk membuat tabel roles dan role_users.
~ php artisan make:model Role -m
Pada perintah diatas, kita membuat model dengan nama Role dan penembahakan argumen -m untuk membuat file migrasi tabel.
Kemudian tambahkan kolom pada file migrasi roles.
//...create_roles_table.php ... Schema::create('roles', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); ...
Buat file migrasi untuk role_users.
~ php artisan make:migration create_role_users_table
Tambahkan kolom pada file migrasi role_users.
//...create_role_users_table.php ... Schema::create('role_users', function (Blueprint $table) { $table->unsignedBigInteger('user_id'); $table->unsignedBigInteger('role_id'); $table->unique(['user_id','role_id']); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade'); }); ...
Kita tambahkan foregn key dengan referensi tabel users dan roles, kolom user_id, role_id, foreign key kolom id, dan on delete Cascade.
Terakhir, kita atur schema di AppServieceProvider.php sebelum melakukan migrasi tabel.
//AppServieceProvider.php <?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); } }
Sekarang kita lakukan migrate.
~ php artisan migrate
Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (7.7 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (3.7 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (2.02 seconds) Migrating: 2020_04_13_222102_create_roles_table Migrated: 2020_04_13_222102_create_roles_table (2.01 seconds) Migrating: 2020_04_13_222141_create_role_users_table Migrated: 2020_04_13_222141_create_role_users_table (31.58 seconds)
4. Relasi Tabel
Selanjutnya kita buat relasi antara tabel users dan roles, kita buat di model user.php dan role.php.
//User.php class User extends Authenticatable { use Notifiable; protected $fillable = [ 'name', 'email', 'password', ]; protected $hidden = [ 'password', 'remember_token', ]; protected $casts = [ 'email_verified_at' => 'datetime', ]; public function roles() { return $this->belongsToMany(Role::class, 'role_users'); } }
//Role.php class Role extends Model { public function users() { return $this->belongsToMany(User::class, 'role_users'); } }
5. Membuat data roles
Kita akan tambahkan data pada tabel roles dengan nama yang kita tentukan sesuai tugasnya.
Kita buat datanya menggunakan seeding. Jalankan perintah dibawah ini untuk membuat seeder.
~ php artisan make:seeder RolesSeeder
File seeder terbuat di folder database/seeds. Buka RolesSeeder.php dan pada method run kita buat statement insert dan tentukan datanya.
//RolesSeeder.php <?php use Illuminate\Database\Seeder; class RolesSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('roles')->insert([ 'name' => 'user', ]); DB::table('roles')->insert([ 'name' => 'admin', ]); } }
Diatas, kita insert value user dan admin pada kolom name sebagai nama role nya. Silahkan jika ingin menambahkan role lainnya.
Selanjutnya buka DatabaseSeeder.php dan tambahkan class RolesSeeder.
//DatabaseSeeder.php <?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { $this->call(RolesSeeder::class); } }
Kemudian jalankan seeders:
~ php artisan db:seed --class=RolesSeeder Database seeding completed successfully.
6. Pendaftaran User Baru
Setelah kita memiliki role di tabel roles. Kita akan coba untuk membuat user baru atau melakukasi registrasi.
Ketika melakukan registrasi, kita akan menyimpan id dari user dan menentukan role dari user tersebut pada tabel role_users.
Silahkan buka RegisterController.php dan kita update method create seperti dibawah ini.
//RegisterController.php ... Use App\Role; ... protected function create(array $data) { $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); $user->roles()->attach(Role::where('name', 'user')->first()); return $user; }
Kita gunakan method attach() untuk menambahkan role pada user dan kita tentukan role default nya yaitu 'user'.
Sekarang kita bisa coba melakukan pendaftaran dari halaman register. Jika berhasil akan ter-redirect ke halaman home dan pada tabel role_user akan berisi id user dan id role.
7. Proteksi Halaman
Setelah proses registrasi dan menentukan role nya. Kita akan membuat fungsi untuk memproteksi halaman, dimana ketika membuka halaman yang tidak sesuai role dari user, maka akan dialihkan ke halaman lain.
Buka kembali model user.php, dan dan tambahkan method dibawah ini.
... public function hasRole($role) { return $this->roles()->where('name', $role)->count() == 1; } ...
Kemudian buka HomeController.php dan buat request di method index seperti dibawah ini.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HomeController extends Controller { public function __construct() { $this->middleware('auth'); } public function index(Request $request) { if ($request->user()->hasRole('user')) { return redirect('user'); } if ($request->user()->hasRole('admin')){ return redirect('admin'); } } }
Ketika melakukan login dengan role 'user' maka akan diarahkan ke halaman user. Begitu juga user dengan role 'admin', akan diarahkan kehalaman admin.
Selanjutnya kita buat 2 controller:
~ php artisan make:controller UserController ~ php artisan make:controller AdminController
//UserController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { public function __construct() { $this->middleware('auth'); } public function index() { if (request()->user()->hasRole('user')) { return view('user.index'); } else { return redirect('/'); } } }
//AdminController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class AdminController extends Controller { public function __construct() { $this->middleware('auth'); } public function index() { if (request()->user()->hasRole('admin')) { return view('admin.index'); } else { return redirect('/'); } } }
Kemudian kita buat route nya di web.php.
Route::get('/admin', 'AdminController@index'); Route::get('/user', 'UserController@index');
Terakhir, kita buat halamannya. Silahkan buat folder user dan admin di direktori views dan file index.blade.php di masing-masing folder. Untuk html nya bisa di copy saja dari file home.blade.php.
//../user/index.blade.php @extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Halaman USER</div> <div class="card-body"> @if (session('status')) <div class="alert alert-success" role="alert"> {{ session('status') }} </div> @endif Login sebagai user! </div> </div> </div> </div> </div> @endsection
//../admin/index.blade.php @extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Halaman ADMIN</div> <div class="card-body"> @if (session('status')) <div class="alert alert-success" role="alert"> {{ session('status') }} </div> @endif Login sebagai admin! </div> </div> </div> </div> </div> @endsection
Sampai disini silahkan mencoba melakukan registrasi. Untuk bisa membuka halaman admin, silahkan ubah role user secara manual pada database di tabel user_roles.