Trang chủ » Blog » Làm quen với Policy trong Laravel

Làm quen với Policy trong Laravel

bởi CodeGym | 06/12/2023 17:29 | Blog

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

Download - Giáo trình thuật toán

2 + 10 =

Tags:

0 Lời bình

Gửi Lời bình

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

BÀI VIẾT LIÊN QUAN

BẠN MUỐN HỌC LẬP TRÌNH?

GỌI NGAY

098 953 44 58

Đăng ký tư vấn lộ trình học lập trình

Đăng ký tư vấn, định hướng lộ trình học và giải đáp các thắc mắc về ngành nghề – Miễn phí – Online.

5 + 2 =

TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM
TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM