Bước 1: Tải dự án Laravel

composer create-project –prefer-dist laravel/laravel Authorization_Gate

laravel

Lưu ý : ở đây mình đang tải laravel bằng composer và tên của dự án là Authorization_Gate.

Bước 2: Cấu hình sử dụng laravel authentication

laravel

chạy lệnh php artisan serve và truy cập link : http://127.0.0.1:8000/ để xem thành quả

Bước 3: Database yêu cầu :

Tạo 1 số bảng ghi để test theo mẫu như sau :

Bảng User

Bảng Post

Bước 4: Tạo Police bằng terminal

laravel

Cú pháp : php artisan make:policy PostPolicy –model=Post ;

Vào Providers/AuthServiceProvider.php : chỉnh sửa thêm vào đoạn mã sau

protected $policies = [
        'App\Post' => 'App\Policies\PostPolicy',
    ];

laravel

vào PostPolicy vừa tạo ở trên:

public function before(User $user){
        if($user->type =='admin'){
            return true;
        }
    }

    public function delete(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }

Phương thức before trả về super admin với toàn quyền
phương thức delete phân quyền user chỉ xóa được bài viết của mình

Bước 5: Controller:
Tạo PostController  với 2 phương thức

public function index(){
        $posts = Post::all();
        return view('post.index', compact('posts'));
    }

    public function destroy(Post $post){
        $this->authorize('delete', $post);
        $post->delete();
        return redirect(route('post.baiviet'));
    }

Vào web gọi phương thức:

Route::get('/home/baiviet', 'PostController@index')->name('post.baiviet');
Route::delete('/home/baiviet/{post}', 'PostController@destroy')->name('post.delete');

laravel

Bước 6: Views cho bài post

post/index :

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
    <title>Document</title>
</head>
<body>
    <div class="container">
        <div style="text-align: center">
            <h1>Bài viết</h1>
            <p> {{ Auth::user()->type }} logged in!</p>
        </div>
        <table class="table table-dark">
            <thead>
            <tr>
                <th scope="col">id</th>
                <th scope="col">tiêu đề</th>
                <th scope="col">nội dung</th>
                <th scope="col" style="min-width: 150px">kiểu người viết</th>
                <th>action</th>
            </tr>
            </thead>
            <tbody>
                @foreach ($posts as $post)
                {{-- @can('views-post', $post) --}}
                <tr>
                    <td>{{$post->id}}</td>
                    <td>{{$post->title}}</td>
                    <td>{{$post->content}}</td>
                    <td style="text-align: center">{{$post->user->type}}</td>
                    <td>
                        <form action="{{route('post.delete', $post->id)}}" method="POST">
                            @csrf
                            @method('delete')
                            <button class="btn btn-danger" onclick="return confirm('ok ?')" >Delete</button>
                        </form>
                    </td>
                </tr>
                {{-- @endcan --}}
            @endforeach

            </tbody>
        </table>
    </div>
</body>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
</html>
  • vào views/ home.blade.php  và thêm vào <p>{{ Auth::user()->type}}</p> để biết user đang login vào thuộc kiểu nào
@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Dashboard</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif
                    <p> {{ Auth::user()->type }} logged in!</p>

                    <a href="{{route('post.baiviet')}}">Bài viết</a>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
  • tạo views/errors/403.blade.php để xem lỗi
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1 style="text-align: center">Bạn ko đủ quyền</h1>  
    <a class="dropdown-item" href="{{ route('logout') }}"
    onclick="event.preventDefault();
                  document.getElementById('logout-form').submit();">
     {{ __('Logout') }}
    </a>
    <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
        @csrf
    </form>
</body>
</html>

Bước 7: Xem thành quả

Laravel

supper admin có mọi quyền ;
user và manager chỉ xóa được mỗi bài viết của chính mình

Author: Phan Thiên Hoàng

Đăng ký nhận bộ tài liệu học Java trên 2 trang giấy tại đây

Xem thêm: Làm quen với Gate trong Laravel