摘要:提供更简单的方式来处理用户授权动作。类似用户认证,有种主要方式来实现用户授权和策略,我这里主要讲解下策略的使用。文档上面有详细的说明,我这里只根据自己使用过程做一个简单的笔记。
Laravel 提供更简单的方式来处理用户授权动作。类似用户认证,有 2 种主要方式来实现用户授权:gates 和策略,我这里主要讲解下策略的使用。
文档 上面有详细的说明,我这里只根据自己使用过程做一个简单的笔记。
例子:我这里准备用编辑文章授权来做演示,在这个权限中,只有文章所有者可以编辑,来体验一下 Policy 如何实现它。
准备工作安装 laravel
composer create-project --prefer-dist laravel/laravel laravel-vue "5.5.*"
建表
php artisan make:migration posts --create=posts Schema::create("posts", function (Blueprint $table) { $table->increments("id"); $table->string("title", 200); $table->text("content"); $table->timestamps(); $table->index("user_id"); });
创建 Model
php artisan make:model PostModel # app/PostModel.php namespace AppModels; use IlluminateDatabaseEloquentModel; class PostModel extends Model { protected $table = "posts"; protected $fillable = ["title", "content", "user_id"]; }生成策略
策略其实就是授权方案所对应的类文件,它在 app/Policies 目录下面,下面我用命令创建一个策略文件。
php artisan make:policy PostPolicy
命令执行完毕之后,会生成 app/Policies/PostPolicy.php 文件,下面我们开始编辑它。
# app/Policies/PostPolicy.php namespace AppPolicies; use AppUser; use AppPostModel; use IlluminateAuthAccessHandlesAuthorization; class TopicPolicy { use HandlesAuthorization; public function create(User $user) { // code } public function update(User $user, PostModel $postModel) { return $user->id === $postModel->user_id; } public function delete(User $user, PostModel $postModel) { // code } }注册策略
授权策略需要注册才能使用,在什么地方注册呢?laravel5.5 在 AuthServiceProvider 中包含一个 policies 的属性,这里面注册策略,下面我们看下如何注册。
# app/Providers/AuthServiceProvider.php namespace AppProviders; use IlluminateSupportFacadesGate; use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider; user AppPostModel; use AppPoliciesPostPolicy; class AuthServiceProvider extends ServiceProvider { protected $policies = [ PostModel::class => PostPolicy::class, // 注意在这里注册 policy ]; public function boot() { $this->registerPolicies(); } }使用策略
注册完毕之后,在 User 模型中有 can 和 cant 方法来使用策略,如在 PostController 编辑时使用:
# app/Http/Controllers/PostController.php public function create() { if (Auth::user()->can("create", PostModel)) { // 注意这里的用法 // 可以创建 } else { // 无权限 } } public function update(Request $request) { $id = $request->input("id"); $post = PostModel::findOrFail($id); if (Auth::user()->can("update", $post)) { // 可以编辑 } else { // 无编辑权限 } }
如果你想超级管理员也拥有编辑权限的话,可以在定义策略的时候加上策略过滤器,也就是一个 before 方法:
# app/Policies/PostPolicy.php public function before($user, $ability) { if ($user->isSuperAdmin()) { return true; } } # app/User.php public function isSuperAdmin() { // 定义ID为1为超级管理员 if ($this->id == 1) { return true; } return false; }
在 balde 模板中使用 @can 和 @cannot方法来判断
@can("create", AppPostModel::class) 创建 @endcan @can("update", $post) 编辑 @endcan
好了,这次就写到这里,希望此篇笔记能帮助到你。
原文地址
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28492.html
摘要:现在面向所有人正式发布了。并且有计划将作为可选扩展包发布,你仍然可以在项目中使用它们。是最新的稳定版本,将在年月左右处理收到的错误修复和更新,并在年月左右之前进行安全修复。中文翻译中文翻译已启动,请关注更多翻译文章请见开发者社区 showImg(https://segmentfault.com/img/remote/1460000018318895?w=1680&h=859); Lar...
摘要:是一个用语言打造的轻量级开源访问控制框架,目前在开源。采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制基于属性的访问控制等。 showImg(https://segmentfault.com/img/bVbkDJf?w=500&h=220); PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架( https://github.com/php...
摘要:自动代码扩展开发时遵守的代码风格是项目开发规范。遵照此规范,在实际操作中,有许多重复,接下来推荐一款专为此规范量身定制的代码生成器。可以利用此扩展来快速构建项目原型。后续还会为大家带来一些最新的技术扩展。 whoops 错误提示扩展 whoops 是一个非常优秀的 PHP Debug 扩展,它能够使你在开发中快速定位出错的位置。laravel默认安装。showImg(https://s...
摘要:自动代码扩展开发时遵守的代码风格是项目开发规范。遵照此规范,在实际操作中,有许多重复,接下来推荐一款专为此规范量身定制的代码生成器。可以利用此扩展来快速构建项目原型。后续还会为大家带来一些最新的技术扩展。 whoops 错误提示扩展 whoops 是一个非常优秀的 PHP Debug 扩展,它能够使你在开发中快速定位出错的位置。laravel默认安装。showImg(https://s...
阅读 3024·2021-10-12 10:20
阅读 2784·2021-09-27 13:56
阅读 762·2021-09-27 13:36
阅读 1396·2021-09-26 09:46
阅读 2397·2019-08-30 14:02
阅读 2666·2019-08-28 18:14
阅读 1236·2019-08-26 10:32
阅读 1663·2019-08-23 18:25