Laravel

Membuat Access Control Laravel – Chapter 2

Membuat Access Control Laravel – Chapter 2

1013 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 Repository Pattern Laravel 5.7 Laravel

Membuat Repository Pattern Laravel 5.7

Laravel hadir dengan berbagai fitur beserta kemudahan yang ditawarkan guna mempercepat proses development, namun bukan berarti hal itu membuat kita menjadi programmer "pemakai" tanpa memikirkan dan be...

Membuat Aplikasi Invoice Laravel 5.7 #6: Laporan Laravel

Membuat Aplikasi Invoice Laravel 5.7 #6:...

Melanjutkan serial belajar Laravel basic dengan terjun langsung untuk membuat sebuah aplikasi, dan serial ini merupakan seri terakhir yakni membuat laporan dalam bentuk PDF. Berikut ada materi bagaima...

Membuat Aplikasi Invoice Laravel 5.7 #5: Manage Invoice & Authentication Laravel

Membuat Aplikasi Invoice Laravel 5.7 #5:...

Setelah sekian lama jeda karena tidak dapat kesempatan untuk menulis, sehingga ada beberapa part konsep dari artikel ini yang hilang begitu saja. Pada kesempatan kali ini kita akan membahas cara Membu...

Komentar