malhal / laravel-createdbypolicy
Laravel模型的安全简单化
Requires
- php: >=5.6.4
- laravel/framework: 5.3.*
- malhal/createdby: *
This package is not auto-updated.
Last update: 2024-09-14 17:43:03 UTC
README
一个特质,通过在策略类中使用简单的布尔值实现授权。它提供创建、写入和读取模式以及基于世界、认证和创建者用户的安全。
它需要Laravel-CreatedBy,它提供了跟踪哪个用户创建了和更新了模型的函数,因此请按照其设置说明进行操作,包括添加created_by_id和updated_by_id的表列和关系。
配置
输入标准的artisan命令来生成策略(将名称替换为您的模型名称)
php artisan make:policy VenuePolicy
正常情况下,将策略添加到AuthServiceProvider的策略数组中,例如。
protected $policies = [
'App\Venue' => 'App\Policies\VenuePolicy',
];
现在来点不同的,在你的项目中打开生成的策略类,并添加以下特质
use CreatedByPolicy;
默认安全参数在CreateByPolicy特质php文件中显示,便于访问,如下所示
// const WORLD_CREATE = false;
// const WORLD_READ = true;
// const WORLD_WRITE = false;
// const AUTHENTICATED_CREATE = true;
// const AUTHENTICATED_READ = false;
// const AUTHENTICATED_WRITE = false;
// const CREATOR_READ = false;
// const CREATOR_WRITE = true;
您可以通过实现常量来覆盖默认的安全级别,例如,防止访客读取
const WORLD_READ = true;
现在您可以使用Laravel内建的授权方法,在无访问权限的情况下将抛出异常,对于creatorRead,将添加全局作用域以限制查询仅针对当前认证用户创建的记录,例如
protected function create(Request $request){
$this->authorize('create', Venue::class);
//
}
Laravel有一个限制,策略只有在存在用户的情况下才有效,因为我们的策略包括世界读取/写入(访客访问),我们需要通过提供者来解决这个问题。在config/app.php中将以下内容添加到提供者数组中
Malhal\CreatedByPolicy\WorldServiceProvider::class
这仅仅是在Auth::user()为null时将其设置为一个新的User,该User没有ID。这意味着Auth::check()将不再按预期工作,您需要使用is_null(Auth::user()->getKey())来检查访客。
如果需要,可以禁用查询上的安全检查,该查询已应用了全局作用域,通过以下操作将其移除
$query->withoutCreatedByPolicy()
当在具有自增的主键的User模型上使用CreatedBy特质时会出现问题。MySQL无法插入新的记录并将外键包含到新创建的ID中。然而,如果您使用UUID作为键,则不会出现此问题。但是,您仍然可以通过在您的User模型中实现此方法来使用策略与自增,该方法假定用户记录总是由用户创建的
public function getCreatedByForeignKey(){
return $this->getKey();
}
安装
需要PHP 5.6.4+和Laravel 5.3+。
要获取Laravel CreatedByPolicy的最新版本,只需使用Composer要求项目即可
$ composer require malhal/laravel-createdbypolicy dev-master