网站内容更新策略(授权动作使用函数的授权方法介绍)

优采云 发布时间: 2021-09-20 18:53

  网站内容更新策略(授权动作使用函数的授权方法介绍)

  用户授权简介

  除了提供现成的用户身份验证服务外,laravel还提供了一种处理用户授权操作的简单方法。与用户身份验证一样,laravel的授权方法非常简单。授权操作有两种主要方法:门和策略

  门和策略可以与路由和控制器相比较。盖茨提供了一种简单的基于闭包的授权方法,策略(如控制器)围绕特定模型或资源对其逻辑进行分组,以实现授权认证。让我们先研究一下盖茨,然后检查一下政策

  在构建应用程序时,您不必在完全使用门还是仅使用策略之间进行选择。大多数应用程序可能同时收录门和策略,并且可以很好地工作。盖茨主要用于模型与资源无关的地方,比如查看管理员面板。相反,应该在特定的模型或资源中使用策略

  盖茨写盖茨

  Gates是一个关闭函数,用于确定用户是否有权执行给定的操作,典型的做法是

  App\providers\authserviceprovider使用门来定义。Gates始终接收一个用户实例作为第一个参数,并且可以接收可选参数,例如相关的雄辩模型:

  /**

* 注册任意用户认证、用户授权服务。

*

* @return void

*/

public function boot()

{

$this->registerPolicies();

Gate::define('update-post', function ($user, $post) {

return $user->id == $post->user_id;

});

}

  闸门也可以使用类似的控制器方法Class@method样式回调字符串:

  /**

* 注册任意用户认证、用户授权服务。

*

* @return void

*/

public function boot()

{

$this->registerPolicies();

Gate::define('update-post', 'App\Policies\PostPolicy@update');

}

  资源门

  您还可以使用resource方法一次定义多个gate方法:

  Gate::resource('posts', 'App\Policies\PostPolicy');

  上述手动定义与以下闸门定义具有相同的效果:

  Gate::define('posts.view', 'App\Policies\PostPolicy@view');

Gate::define('posts.create', 'App\Policies\PostPolicy@create');

Gate::define('posts.update', 'App\Policies\PostPolicy@update');

Gate::define('posts.delete', 'App\Policies\PostPolicy@delete');

  默认情况下,将定义视图、创建、更新和删除方法。通过将数组作为第三个参数传递给资源方法,可以重写它们或将它们添加到默认方法。数组的键定义功能的名称,值定义方法的名称。例如,以下代码将创建两个新的浇口定义-posts.image和posts.photo:

  Gate::resource('posts', 'PostPolicy', [

'image' => 'updateImage',

'photo' => 'updatePhoto',

]);

  授权行动

  使用门授权操作时,应使用允许或拒绝方法。请注意,您不需要将这些方法传递给经过身份验证的用户。Laravel将自动处理经过身份验证的用户,并将其传递给Gete closure函数:

  if (Gate::allows('update-post', $post)) {

// 指定当前用户可以进行更新...

}

if (Gate::denies('update-post', $post)) {

// 指定当前用户不能更新...

  如果要确定特定用户是否已被授权访问某个操作,可以在gate facade上使用foruser方法:

  if (Gate::forUser($user)->allows('update-post', $post)) {

// 用户可以更新...

}

if (Gate::forUser($user)->denies('update-post', $post)) {

// 用户不能更新...

}

  闸门截距检查

  有时,您可能希望将所有功能授予特定用户。因此,您可以使用before方法定义要在所有其他授权检查之前运行的回调:

  Gate::before(function ($user, $ability) {

if ($user->isSuperAdmin()) {

return true;

}

});

  如果before回调方法返回非null结果,则该结果将被视为检查结果

  在每次授权检查之后,可以使用After方法定义要执行的回调。但是,您不能通过after callback方法修改授权检查的结果:

  Gate::after(function ($user, $ability, $result, $arguments) {

//

});

  与before检查类似,如果after回调返回非null结果,则该结果将被视为检查结果

  创建策略生成策略

  策略是在特定模型或资源中组织授权逻辑的类。例如,如果您的应用程序是一个博客,那么在创建或更新博客时,您可能有一个post模型和相应的post策略来授权用户操作

  您可以使用“艺术家”命令中的“制作:策略艺术家”命令来生成策略。生成的策略将放置在app/policies目录中。如果应用程序中不存在此目录,laravel将自动为您生成:

  php artisan make:policy PostPolicy

  make:Policy命令生成一个空策略类。如果要生成的类收录基本的“crud”策略方法,则可以在执行命令时指定--model:

  php artisan make:policy PostPolicy --model=Post

  {tip}所有策略都将通过laravel的服务容器解析,允许您在策略构造函数中对任何必需的依赖项使用类型提示,并自动注入它们

  注册政策

  一旦策略存在,就需要对其进行注册。新的laravel应用程序中收录的authserviceprovider具有一个Policys属性,该属性可以将各种模型映射到它们的策略。注册策略将指导laravel在授权访问指定模型的操作时使用哪个策略:

<p>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线