Membuat Role Users dengan Laravel 7

whynwd

whynwd Selasa, 21 April 2020

Membuat Role Users dengan Laravel 7

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.

Membuat Role Users dengan Laravel 7

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
Membuat Role Users dengan Laravel 7

Membuat Role Users dengan Laravel 7

Sampai disini silahkan mencoba melakukan registrasi. Untuk bisa membuka halaman admin, silahkan ubah role user secara manual pada database di tabel user_roles.

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel