Laravel

Membuat Access Control Laravel – Chapter 2

Membuat Access Control Laravel – Chapter 2

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

Backend Developer iTechShark, salah satu perusahaan asal Amerika. Senang dengan teknologi baru. Laravel addict yang tidak fanatik. Merekam jejak dengan menulis

Membuat Aplikasi Invoice Laravel 5.7 #4: Create Invoice Laravel

Membuat Aplikasi Invoice Laravel 5.7 #4:...

Kenapa masih disebut bagian dari CRUD? Sebab fitur untuk membuat invoice baru, kita menggunakan fungsi Create. sedangkan fitur untuk menampilkan, invoice yang digunakan adalah fungsi Read. Berikut ada...

Membuat Aplikasi Invoice Laravel 5.7 #3: Manajemen Customer Laravel

Membuat Aplikasi Invoice Laravel 5.7 #3:...

Lanjutan seri sebelumnya yang membahas tentang module manajemen produk, pada seri ini kita akan menyelesaikan module customer. Masih berkaitan dengan CRUD karena kedua module ini merupakan data master...

Membuat Aplikasi Invoice Laravel 5.7 #2: Manajemen Produk Laravel

Membuat Aplikasi Invoice Laravel 5.7 #2:...

Melanjutkan seri belajar Laravel dengan case Membuat aplikasi invoice, dimana pada seri sebelumnya kita telah membuat struktur database yang akan digunakan. Pada seri ini, target yang akan dicapai ada...

Komentar