简介

在特定模型或资源中组织授权逻辑的类,指定某些动作是否有权限操作。

创建策略

使用 artisan 的 make:policy 命令进行创建

  1. php artisan make:policy AdminPolicy

如果你想生成一个包含基本的 “CRUD(增删改查)” 策略方法的类,你可以在执行命令时指定一个 --model

  1. php artisan make:policy AdminPolicy --model=admin

生成的策略将放在 app/Policies 目录。

注册策略

只要模型和策略遵循标准的 Laravel 命名约定可以自动发现策略,,即:策略位于包含模型的目录下的 Policies 目录中。

因为新增了 Model 文件夹,需要使用 Gate::guessPolicyNamesUsing 方法手动注册策略,通常这个方法在 AuthServiceProviderboot 方法中调用:

  1. use Illuminate\Support\Facades\Gate;
  2. Gate::guessPolicyNamesUsing(function ($modelClass) {
  3. // 返回策略类名
  4. return 'App\\Policies\\'.class_basename($modelClass).'policy'; //使用动态类名之后创建的策略都不需要再注册
  5. });

注意:在 AuthServiceProvider 中显式映射的任何策略都将优先于任何潜在的自动发现策略。

编写策略

示例:

  1. use Illuminate\Auth\Access\Response;
  2. //策略:超级管理员编辑和删除保护
  3. public function remove(AdminUser $adminuser , $targetAdminUser){
  4. if($targetAdminUser->id == 1){
  5. return Response::deny("禁止对超级管理员进行操作");
  6. }
  7. return true;
  8. }

使用策略

对「编写策略」中的示例有效

  1. $this->authorizeForUser(Auth::guard('admin')->user(), 'remove', $adminuser);