~ We are changing the world with technology. ~

Matt Mullenweg

Membuat Access Control Laravel – Chapter 2

Membuat Access Control Laravel – Chapter 2

3288 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.

Full Stack Developer & Remote Worker salah satu perusahaan asal Australia. Senang dengan teknologi baru. Laravel addict yang tidak fanatik. Merekam jejak dengan menulis

Drag & Drop Upload File Dropzone di Laravel 8 Laravel

Drag & Drop Upload File Dropzone di Lara...

Salah satu fitur yang cukup penting lainnya adalah upload files yang terdiri dari gambar, document, dan lain sebagainya yang berperan sebagai pelengkap data. Dropzone hadir sebagai salah satu library...

Mengirim Email Notifikasi Menggunakan SMTP Gmail Laravel 8 Laravel

Mengirim Email Notifikasi Menggunakan SM...

Mengirim email notifikasi adalah sebuah fitur yang hampir semua aplikasi mengimplementasikannya, karena melalui email adalah cara paling umum dan formal untuk menyampaikan informasi kepada orang lain....

Membuat CRUD Laravel 8 & Jetstream Livewire Laravel

Membuat CRUD Laravel 8 & Jetstream Livew...

Laravel hadir dengan versi baru beserta teknologinya yang baru, sebut saja Jetstream dengan opsi yang ditawarkannya, yakni: Livewire dan Inertia. Melalui artikel ini kita akan membahas bagaimana membu...

Komentar