Laravel进阶系列笔记--(三十)Laravel 用户授权之Policy授权策略(进阶系列笔记完毕)
作者:温新
时间:2021-08-04
hi,我是温新,一-名PHPer。
本系列采用Laravel8.x演示。
当授权多了,将所有逻辑写AuthServiceProvider服务提供者显示不合适也不优雅也不好维护。Laravel提供了Policy类,可以像控制器一样使用,
本篇案例在 Laravel进阶系列笔记--(29)Laravel 用户授权之Gate快速使用 基础上进行修改。
第一步:新建Post模型及迁移文件
1)创建模型及对应的迁移文件
php artisan make:model Post -m
2)迁移文件
// 对应的post迁移文件
Schema::create('posts', function (Blueprint $table) {
    $table->unsignedInteger('id');
    $table->string('title','180');
    $table->text('content');
    $table->unsignedInteger('user_id')->index();
    $table->timestamps();
});
3)生成表
php artisan migrate
4)自行添加文章数据
第二步:生成文章策略
php artisan make:policy PostPolicy
第三步:编写策略文件
//PostPolicy.php
use App\Models\Post;
use App\Models\User;
public function update(User $user, Post $post)
{
    return $user->id === $post->user_id;
}
第四步:注册策略
//  App/Providers/AuthServiceProvider.php
protected $policies = [
    'App\Models\Post'   =>  'App\Policies\PostPolicy'
];
第五步:粗略使用授权
// web.php
// 只有文章的发布者才能修改文件
Route::get('art',function(\Illuminate\Support\Facades\Request $request) {
    $id = 2;
    $post = \App\Models\Post::find($id);
    if (Auth::user()->can('update', $post)) {
        return 'succ';
    } else {
        return '无权修改该文章';
    }
});
第六步:静态页面的使用
1)新建路由
// web.php
Route::get('arts','TestController@index');
2)新建控制器方法
// TestController.php
use App\Models\Post;
public function index()
{
    $arts = Post::all();
    return view('arts', compact('arts'));
}
3)新建视图并进行权限验证
// resources/views/arts.blade.php
@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">
                    @foreach($arts as $art)
                        <a href="">{{ $art->title }}</a>
                    @can('update',$art)
                        <span>编辑 {{ $art->id }}</span><br>
                    @endcan
                    @endforeach
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
只有是登录用户自己发布的文章才会显示对应的编辑案例。
进阶笔迹结束语
时间:2021-09-02 更新
关于进阶系列笔迹的总结就不单独写一篇文章了。今天(2021-09-02)以更新的形式记录。
进阶系列的笔迹虽然结束了,但这不是结束,而是一个新开始。要更好的掌握这些知识,就要不断的把这些知识融入到实际项目中。进阶系列的笔迹仅仅只是一个抛砖引玉的作用。
明天我将开启我的西藏之旅。
我是温新,学习的路上,一起进步!
我是温新
每天进步一点点,就一点点
请登录后再评论