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)以更新的形式记录。
进阶系列的笔迹虽然结束了,但这不是结束,而是一个新开始。要更好的掌握这些知识,就要不断的把这些知识融入到实际项目中。进阶系列的笔迹仅仅只是一个抛砖引玉的作用。
明天我将开启我的西藏之旅。
我是温新,学习的路上,一起进步!
我是温新
每天进步一点点,就一点点
请登录后再评论