~ We are changing the world with technology. ~

Matt Mullenweg

Membuat Access Control Laravel – Chapter 2

Membuat Access Control Laravel – Chapter 2

4297 Dilihat

Sebagaimana yang disinggung pada artikel sebelumnya dalam seri membuat access control laravel – chapter 1, kali ini kita melanjutkannya dengan materi yang berbeda yakni Exception. Berangkat dari sebuah exception sederhana untuk menangani error message yang di hasilkan. Ada 4 pendekatan yang akan kita lakukan, diantaranya :

1. Membuat Exception

2. Memodifikasi file Handler untuk menangani exception

3. Membuat view untuk exception dengan custom message

4. Menggunakan exception pada controller dengan use statement

Membuat Exception

Tahapan pertama, buat sebuah file pada folder app/Exceptions dengan nama UnauthException.php, dan kurang lebih direktorinya akan terlihat seperti ini :

Kemudian ketikkan syntax berikut :

<?php
namespace App\Exceptions;

class UnauthException extends \Exception
{
	
}

Selanjutnya modifikasi file Handler.php menjadi seperti berikut :

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use App\Exceptions\UnauthException;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that should not be reported.
     *
     * @var array
     */
    protected $dontReport = [
        \Illuminate\Auth\AuthenticationException::class,
        \Illuminate\Auth\Access\AuthorizationException::class,
        \Symfony\Component\HttpKernel\Exception\HttpException::class,
        \Illuminate\Database\Eloquent\ModelNotFoundException::class,
        \Illuminate\Session\TokenMismatchException::class,
        \Illuminate\Validation\ValidationException::class,
    ];

    /**
     * Report or log an exception.
     *
     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
     *
     * @param  \Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        switch($exception){
            
            case $exception instanceof UnauthException:
                if ($request->ajax()) {
                    return response()->json(['error' => 'Unauthorized'], 500);
                }
                return response()->view('errors.unauth-exception', compact('exception'), 500);
            break;
            default: 
                return parent::render($request, $exception);
        }
    }

    /**
     * Convert an authentication exception into an unauthenticated response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Auth\AuthenticationException  $exception
     * @return \Illuminate\Http\Response
     */
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }

        return redirect()->guest(route('login'));
    }
}

Jadi yang pertama kita lakukan adalah menambahkan use statement pada use statement section :

use App\Exceptions\UnauthException;

Selanjutnya, menambahkan switch statement didalam render method :

case $exception instanceof UnauthException:
     if ($request->ajax()) {
        return response()->json(['error' => 'Unauthorized'], 500);
     }
     return response()->view('errors.unauth-exception', compact('exception'), 500);
break;

Tentu saja kita belum memiliki view unauth-exception.blade.php didalam folder errors.

Buat unauth-exception.blade.php dengan mengetikkan syntax berikut didalamnya :

@extends('layouts.app')
@section('content')
	<div class="alert alert-danger alert-dismissible alert-important" role="alert">
		<button type="button" class="close" data-dismiss="alert" aria-label="Close">
		<span aria-hidden="true">&times;</span></button>
		<strong>Error!</strong>
		{{ $exception->getMessage() }}
		Kamu belum di izinkan untuk melakukan ini.
	</div>
@endsection

Kita menggunakan getMessage jadi anda dapat menampilkan pesan secara optional. Mari kita coba memenggunakan exception yang telah kita buat pada controller. Tambahkan use statement untuk menggunakan use statement pada PostController :

use App\Exceptions\UnauthException;

Kemudian pada Update method, hapus :

dd('kamu bukan pemilik post ini');

dan ganti dengan :

throw new UnauthException;

Sekarang jika anda mencoba melakukan update, anda seharusnya menemukan pesan error seperti berikut :

Code yang cukup sederhana untuk mengecek hak akses lalu menampilkan exception :

if ($this->userNotOwnerOf($post)){
   throw new UnauthException;
}

4 Point yang telah disinggung diawal telah kita selesaikan dengan baik. Seri selanjutnya akan kita bahas pada tutorial berikutnya. Semoga bermanfaat.

FullStack Developer, Mobile Developer & Freelancer. Senang dengan teknologi baru. Laravel addict yang tidak fanatik. Merekam jejak dengan menulis

Aplikasi Booking Online Laravel 9 & Livewire #4: Dashboard Admin Page Laravel

Aplikasi Booking Online Laravel 9 & Live...

Klinik memiliki akses penuh dalam mengelola data Pasien, maka melalui artikel ini kita akan membuat 3 buah fitur, yakni: fitur Authentication menggunakan Laravel Jetstream, Kelola data Pasien dan Kelo...

Aplikasi Booking Online Laravel 9 & Livewire #3: Livewire Component & Sistem Antrian Laravel

Aplikasi Booking Online Laravel 9 & Live...

Fitur Janji Temu atau Appointment telah dibuat, berdasarkan data tersebut, kita akan mengolahnya menjadi antrian online. Data akan dikelompokkan dan diurutkan sesuai urutan pasien yang lebih dahulu me...

Aplikasi Booking Online Laravel 9 & Livewire #2: Blade Templating & Appointment Laravel

Aplikasi Booking Online Laravel 9 & Live...

Seri ke-dua dari belajar membuat Aplikasi Booking Online menggunakan Laravel 9 & Livewire adalah bagaimana memadukan Blade templating dan Livewire. Kita juga akan belajar bagaiman setup dengan Livewir...

Komentar