Bước 1: Tải dự án Laravel
composer create-project –prefer-dist laravel/laravel Authorization_Gate
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
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ước 4: Tạo Police bằng terminal
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', ];
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');
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ả
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
0 Lời bình