Cara Mengatur Hak Akses di Laravel 8

Pada tutorial ini akan membahas Cara Mengatur Hak Akses di Laravel 8, Pembagian Hak Akses biasa digunakan dalam pembuatan aplikasi sebagai pembatasan akses user untuk halaman maupun fitur tertentu, misal dalam aplikasi blog ada role Administrator dan ada role Operator, untuk administrator dapat mengakses semua halaman dan semua fitur di admin, sedangkan Operator hanya dibolehkan mengakses halaman dan fitur tertentu saja, Secara default Laravel sudah menyediakan fitur Authorization yang dapat kita gunakan, referensi dari https://laravel.com/docs/8.x/authorization ,

Sebelum mengikuti tutorial ini di pastikan anda telah mengikuti tutorial sebelumnya di website ini :

  1. Install Laravel versi 8 di Windows 10
  2. Cara Membuat Database di Laravel 8
  3. Generate Key Aplikasi di Laravel 8
  4. Cara Mengatur Zona Waktu Indonesia di Laravel 8
  5. Cara Mengatur Validasi ke bahasa Indonesia di Laravel 8
  6. Blade Templating di laravel 8
  7. Cara membuat fitur Login Logout di Laravel 8

Ada beberapa cara untuk mengatur hak akses ini, kita akan menggunakan bantuan Middleware Laravel untuk membuat Hak Akses, Berikut adalah Cara Mengatur Hak Akses di Laravel 8 :

Tahap persiapan kita modifikasi terlebih dahulu filed di tabel users, tambahkan filed dengan nama namerole dengan type data string, untuk modifikasi kita buka file tabel users di folder database/migrations sebagai berikut :

lalu modifikasi file database/factories/UserFactory.php dan tambahkan filed namerole sebagai berikut :

lalu modifikasi file app/models/User.php dan tambahkan filed namerole sebagai berikut :

pastikan xampp (apache & mysql) sudah running, lalu kita coba rollback dan migrate tabel database kita dengan perintah ini di terminal :

begini proses dan hasilnya :

sekarang kalo kita buka di http://localhost/phpmyadmin/ maka semua tabel akan kosong datanya kita kecuali tabel migrations.
setelah ini kita buat data dummy dengan jalan kan perintah ini di terminal :

php artisan db:seed --class=DatabaseSeeder

begini proses dan hasilnya :

setelah data dummy users tergenerate, maka lakukan perubahan value untuk salah satu row di kolom namerole ubah menjadi operator seperti di atas.

Di tutorial sebelumnya kita hanya baru punya halaman dashboard, dan halaman login, untuk simulasi hak akses ini kita butuh minimal 2 halaman di admin, yaitu halaman dashboard dan halaman data post, dengan ketentuan role administrator bisa mengakses halaman dashboard dan data post, sedangkan role operator hanya bisa mengakses halaman data post saja.

sekarang buat controller dengan nama PostController dengan perintah ini di terminal :

php artisan make:controller PostController

begini proses dan hasilnya :

buka file app/Http/Controllers/PostController.php dan lakukan modifikasi script seperti ini :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        //Tampilan index di dalam folder data_post
        return view('data_post.index');
    }
}

Lalu kita buatkan view nya, buat folder di dalam folder resources/views dengan nama folder data_post dan buat file dengan nama index.blade.php seperti ini :

buka file resources/views/data_post/index.blade.php dan isi dengan script di bawah ini :

@extends('template.layout') <!-- panggil file layout.blade.php di folder template -->
@section('title', 'Data Post') <!-- replace nama title jika halaman ini dipanggil -->
@section('content') <!-- replace isi konten jika halaman ini dipanggil -->
    <div class="page-heading">
        <div class="page-title">
            <div class="row">
                <div class="col-12 col-md-6 order-md-1 order-last">
                    <h3>Data Post</h3>
                    <p class="text-subtitle text-muted">kelola data post.</p>
                </div>
                <div class="col-12 col-md-6 order-md-2 order-first">
                    <nav aria-label="breadcrumb" class="breadcrumb-header float-start float-lg-end">
                        <ol class="breadcrumb">
                            <li class="breadcrumb-item"><a href="{{route('dashboard')}}">Dashboard</a></li>
                            <li class="breadcrumb-item active" aria-current="page">Data Post</li>
                        </ol>
                    </nav>
                </div>
            </div>
        </div>
        <section class="section">
            <div class="card">
                <div class="card-header">
                    <h4 class="card-title">Data Post</h4>
                </div>
                <div class="card-body">
                    halaman data post
                </div>
            </div>
        </section>
    </div>
@endsection <!-- penutup isi konten -->

Setelah tahap persipan di atas selesai kita masuk tahap selanjutnya yaitu kita buat file Middleware baru dengan nama RoleAccess dengan perintah ini di terminal :

php artisan make:middleware RoleAccess

begini proses dan hasilnya :

buka file app/Http/Middleware/RoleAccess.php dan lakukan modifikasi script seperti ini :

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class RoleAccess
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next, ...$roles)
    {
        if(in_array($request->user()->namerole, $roles)){
            return $next($request);
        }
        return redirect('/');
    }
}

lalu buka file app/Http/Middleware/RedirectIfAuthenticated.php dan lakukan modifikasi script seperti ini :

<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @param  string|null  ...$guards
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next, ...$guards)
    {
        $guards = empty($guards) ? [null] : $guards;

        //saat akses halaman dengan middleware guest akan diarahkan ke halaman tertentu sesuai logic di bawah jika user sudah punya session
        foreach ($guards as $guard) {
            if (Auth::guard($guard)->check()) {
                if($request->user()->namerole=='administrator'){
                    return redirect()->route('dashboard');
                }elseif($request->user()->namerole=='operator'){
                    return redirect()->route('data_post');
                }else{
                    return redirect()->route('logout');
                }        
            }
        }

        return $next($request);
    }
}

lalu daftarkan Middleware yang baru di file app/Http/Kernel.php seperti ini :

setelah kita konfig di Middleware sekarang kita modifikasi route kita sesuaikan dengan perubahan yang ada, buka file routes/web.php modifikasi script menjadi seperti ini :

<?php

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\LoginController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\PostController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

//INDEX
Route::get('/', [LoginController::class, 'index'])->middleware('guest');

//AUTH MANUAL
Route::get('/login', [LoginController::class, 'index'])->name('login')->middleware('guest');
Route::post('/login', [LoginController::class, 'authenticate'])->name('login')->middleware('guest');
Route::match(['get','post'],'/logout', [LoginController::class, 'logout'])->name('logout');

//DASHBOARD
Route::resource('dashboard', 'DashboardController')->except(['show'])->middleware('auth','roleaccess:administrator');
Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard')->middleware('auth','roleaccess:administrator');

//POST
Route::resource('data_post', 'PostController')->except(['show'])->middleware('auth','roleaccess:administrator,operator');
Route::get('data_post', [PostController::class, 'index'])->name('data_post')->middleware('auth','roleaccess:administrator,operator');

dari script route di atas, kita bisa berikan hak akses per method di Controller ini terlihat dari –>middleware(‘auth’,’roleaccess:administrator,operator’) untuk middelware auth artinya method tersebut hanya bisa di akses jika user mempunyai session atau sudah login , dan yang membedakan hak akses ada di middleware roleaccess:administrator,operator artinya bisa di akses oleh role administrator dan operator, roleaccess sendiri adalah nama middleware yang diregister di kernel sebelumnya.

lalu kita modifikasi sidebar menu di file resources/views/template/sidebar.blade.php seperti ini :

<!-- declare variabel get url segment satu -->
@php
    $segment1=request()->segment(1);
@endphp
<div id="sidebar">
    <div class="sidebar-wrapper active">
        <div class="sidebar-header position-relative">
            <div class="d-flex justify-content-between align-items-center">
                <div class="logo">
                    <a href="/"><img src="{{ asset('') }}dist/assets/compiled/svg/logo.svg" alt="Logo"/></a>
                </div>
                <div class="theme-toggle d-flex gap-2 align-items-center mt-2">
                    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--system-uicons" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 21 21">
                        <g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round">
                            <path d="M10.5 14.5c2.219 0 4-1.763 4-3.982a4.003 4.003 0 0 0-4-4.018c-2.219 0-4 1.781-4 4c0 2.219 1.781 4 4 4zM4.136 4.136L5.55 5.55m9.9 9.9l1.414 1.414M1.5 10.5h2m14 0h2M4.135 16.863L5.55 15.45m9.899-9.9l1.414-1.415M10.5 19.5v-2m0-14v-2" opacity=".3"></path>
                            <g transform="translate(-210 -1)">
                                <path d="M220.5 2.5v2m6.5.5l-1.5 1.5"></path>
                                <circle cx="220.5" cy="11.5" r="4"></circle>
                                <path d="m214 5l1.5 1.5m5 14v-2m6.5-.5l-1.5-1.5M214 18l1.5-1.5m-4-5h2m14 0h2"></path>
                            </g>
                        </g>
                    </svg>
                    <div class="form-check form-switch fs-6">
                        <input class="form-check-input me-0" type="checkbox" id="toggle-dark" style="cursor: pointer" />
                        <label class="form-check-label"></label>
                    </div>
                    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--mdi" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24">
                        <path
                            fill="currentColor"
                            d="m17.75 4.09l-2.53 1.94l.91 3.06l-2.63-1.81l-2.63 1.81l.91-3.06l-2.53-1.94L12.44 4l1.06-3l1.06 3l3.19.09m3.5 6.91l-1.64 1.25l.59 1.98l-1.7-1.17l-1.7 1.17l.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95l2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85c-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14c.4-.4.82-.76 1.27-1.08c.75-.53 1.93.36 1.85 1.19c-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82c-2.81 3.14-2.7 7.96.31 10.98c3.02 3.01 7.84 3.12 10.98.31Z"
                        ></path>
                    </svg>
                </div>
                <div class="sidebar-toggler x">
                    <a  href="#" class="sidebar-hide d-xl-none d-block"><i class="bi bi-x bi-middle"></i></a>
                </div>
            </div>
        </div>
        <div class="sidebar-menu">
            <ul class="menu">
                <li class="sidebar-title">Menu</li>
                <!-- jika url segment satu adalah dashboard maka menu active -->
                <li class="sidebar-item @if($segment1=='dashboard') active @endif">
                    <!-- memanggil route dashboard -->
                    <a href="{{route('dashboard')}}" class="sidebar-link">
                        <i class="bi bi-grid-fill"></i>
                        <span>Dashboard</span>
                    </a>
                </li>
                <li class="sidebar-item @if($segment1=='data_post') active @endif has-sub">
                    <a href="#" class="sidebar-link">
                        <i class="bi bi-book-half"></i>
                        <span>Post</span>
                    </a>
                    <ul class="submenu @if($segment1=='data_post') active submenu-open @endif">
                        <li class="submenu-item">
                            <a href="#" class="submenu-link">Tambah Post</a>
                        </li>
                        <li class="submenu-item @if($segment1=='data_post') active @endif">
                            <a href="{{route('data_post')}}" class="submenu-link" >Data Post</a>
                        </li>
                    </ul>
                </li>

                <li class="sidebar-title">Sistem</li>
                <li class="sidebar-item">
                    <!-- start form logout -->
                    <form method="POST" action="{{ route('logout') }}" >
                        @csrf
                        <div class="sidebar-link"> 
                            <button type="submit" class="dropdown-item"><i class="bi bi-box-arrow-right"></i> Logout</button>
                        </div>
                    </form>
                    <!-- end form logout -->
                </li>
            </ul>
        </div>
    </div>
</div>

Tahap terakhir kita testing aplikasi nya, Jalankan project laravel nya dengan perintah ini di terminal :

begini proses dan hasilnya :

buka browser dan masukan di URL browser chrome http://127.0.0.1:8000 sebagai berikut :

kita masuk dengan role operator, Untuk Email kita bisa copy dari database yang memang sudah dibuat di tahap sebelumnya, untuk password secara default laravel adalah password, harusnya saat berhasil login akan diarahkan ke halaman data post seperti ini :

dan jika user operator, mengakses halmaan dashboard maka akan di arahkan ke default yaitu halaman data post,

begitupun jika kita test login menggunakan user administrator maka setelah login akan langsung di arahkan ke halaman dashboard.

dan jika kita test setelah login mengakses halaman login maka akan langsung di arahkan ke halaman default nya sesuai rolenya.

Selesai, Selamat Mencoba.

Artikel selanjutnya akan membahas Cara Membuat Helper di laravel 8

Leave a Reply

Your email address will not be published. Required fields are marked *