💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
#### 创建策略 通过命令行创建策略,创建的策略在app/policies文件夹下. ~~~ php artisan make:policy UserPolicy ~~~ 我们定义一个方法,用于用户更新时的权限验证. ~~~ public function update(User $currentUser, User $user) { return $currentUser->id === $user->id; } ~~~ update 方法接收两个参数,第一个参数默认为当前登录用户实例,第二个参数则为要进行授权的用户实例。当两个 id 相同时,则代表两个用户是相同用户,用户通过授权,可以接着进行下一个操作。如果 id 不相同的话,将抛出 403 异常信息来拒绝访问。 使用授权策略需要注意以下两点: 1. 我们并不需要检查 $currentUser 是不是 NULL。未登录用户,框架会自动为其 所有权限 返回 false. 2. 调用时,默认情况下,我们 不需要 传递当前登录用户至该方法内,因为框架会自动加载当前登录用户(接着看下去,后面有例子). 接下来我们还需要在 AuthServiceProvider 类中对授权策略进行设置。AuthServiceProvider 包含了一个 policies 属性,该属性用于将各种模型对应到管理它们的授权策略上。我们需要为用户模型 User 指定授权策略 UserPolicy。 在app/Providers/AuthServiceProvider.php文件中注册策略. ~~~ protected $policies = [ \App\Models\User::class => \App\Policies\UserPolicy::class, //策略所应用的模型 ]; ~~~ 授权策略定义完成之后,我们便可以通过在用户控制器中使用 authorize 方法来验证用户授权策略。默认的 App\Http\Controllers\Controller 类包含了 Laravel 的 AuthorizesRequests trait。此 trait 提供了 authorize 方法,它可以被用于快速授权一个指定的行为,当无权限运行该行为时会抛出 HttpException。authorize 方法接收两个参数,第一个为授权策略的名称,第二个为进行授权验证的数据。 ~~~ $this->authorize('update', $user); ~~~ 这里 update 是指授权类里的 update 授权方法,$user 对应传参 update 授权方法的第二个参数。正如上面定义 update 授权方法时候提起的,调用时,默认情况下,我们 不需要 传递第一个参数,也就是当前登录用户至该方法内,因为框架会自动加载当前登录用户。 ## 再举例一个策略的场景 管理员可以对普通用户进行删除,但是管理员不能删除自己. ~~~ class UserPolicy { use HandlesAuthorization; public function destroy(User $currentUser, User $user) { return $currentUser->is_admin && $currentUser->id !== $user->id; } } ~~~