简介
在特定模型或资源中组织授权逻辑的类,指定某些动作是否有权限操作。
创建策略
使用 artisan 的 make:policy
命令进行创建
php artisan make:policy AdminPolicy
如果你想生成一个包含基本的 “CRUD(增删改查)” 策略方法的类,你可以在执行命令时指定一个 --model
:
php artisan make:policy AdminPolicy --model=admin
生成的策略将放在 app/Policies
目录。
注册策略
只要模型和策略遵循标准的 Laravel 命名约定可以自动发现策略,,即:策略位于包含模型的目录下的 Policies
目录中。
因为新增了 Model 文件夹,需要使用 Gate::guessPolicyNamesUsing
方法手动注册策略,通常这个方法在 AuthServiceProvider
的 boot
方法中调用:
use Illuminate\Support\Facades\Gate;
Gate::guessPolicyNamesUsing(function ($modelClass) {
// 返回策略类名
return 'App\\Policies\\'.class_basename($modelClass).'policy'; //使用动态类名之后创建的策略都不需要再注册
});
注意:在
AuthServiceProvider
中显式映射的任何策略都将优先于任何潜在的自动发现策略。
编写策略
示例:
use Illuminate\Auth\Access\Response;
//策略:超级管理员编辑和删除保护
public function remove(AdminUser $adminuser , $targetAdminUser){
if($targetAdminUser->id == 1){
return Response::deny("禁止对超级管理员进行操作");
}
return true;
}
使用策略
对「编写策略」中的示例有效
$this->authorizeForUser(Auth::guard('admin')->user(), 'remove', $adminuser);