Laravel进阶系列笔记--(三十)Laravel 用户授权之Policy授权策略(进阶系列笔记完毕)

作者: 温新

分类: 【Laravel】

阅读: 1857

时间: 2021-09-02 11:29:00

作者:温新

时间: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)以更新的形式记录。

进阶系列的笔迹虽然结束了,但这不是结束,而是一个新开始。要更好的掌握这些知识,就要不断的把这些知识融入到实际项目中。进阶系列的笔迹仅仅只是一个抛砖引玉的作用。

明天我将开启我的西藏之旅。

我是温新,学习的路上,一起进步!

我是温新

每天进步一点点,就一点点

请登录后再评论