~ We are changing the world with technology. ~

Matt Mullenweg

Membuat Access Control Laravel – Chapter 2

Membuat Access Control Laravel – Chapter 2

2775 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

Aplikasi E-Commerce Laravel 6 #20: Auto Upload Produk Marketplace Laravel

Aplikasi E-Commerce Laravel 6 #20: Auto...

Dewasa ini, marketplace menjadi platform untuk jual-beli yang banyak digemari baik bagi penjual maupun pembeli karena banyaknya promo yang diberikan oleh platform tersebut. Sehingga, data produk biasa...

Aplikasi E-Commerce Laravel 6 #19: Fitur Ongkos Kirim Laravel

Aplikasi E-Commerce Laravel 6 #19: Fitur...

Sejak pertama kali serial Membuat Aplikasi E-Commerce Laravel 6 di-release, ada banyak permintaan untuk menerapkan fitur ongkos kirim, namun kendalanya, tidak satupun yang memiliki license ongkos kiri...

Cara Membuat Sistem Komentar Dengan Laravel 7 Laravel

Cara Membuat Sistem Komentar Dengan Lara...

Membangun sebuah aplikasi yang membutuhkan feedback dari penggunanya, seperti blog, e-commerce dan lain sebagainya membutuhkan sistem komentar untuk saling interaksi antara pemilik dan pengguna atau a...

Komentar