【问题标题】:How to Dynamically add gates in Laravel?如何在 Laravel 中动态添加门?
【发布时间】:2018-08-14 08:31:05
【问题描述】:

如何在 Laravel 中动态添加门? 我在 laravel 上构建了我的 CMS,它支持插件。插件可以在仪表板,一些页面,路线等中添加菜单项。我需要使用门来保护编辑/删除/添加/更改页面,例如,授权用户没有创建。 所以我需要每个插件都可以动态添加这个权限(查看/add/edit/update/delete/) 我怎么能做到这一点? 顺便说一句,插件位于 APP/Plugins 文件夹中。 管理员可以将此权限附加到某些角色http://prntscr.com/kidnxz https://pastecode.xyz/view/bcb9d00f 这是我拥有的示例表。 我还需要添加权限表权限的问题 我使用 laravel 5.6

这里是简单插件示例 pastecode.xyz/view/75d2fa28 在插件加载时调用 boot 并在用户激活此插件时调用 onActivate

我正在寻找类似动态策略的东西

或点赞https://octobercms.com/docs/plugin/registration

  'permissions' => ['acme.blog.*'],

【问题讨论】:

  • 通常其他 CMS 有“钩子”,并且底层框架在适当的启动阶段调用每个插件钩子。例如,您可以在您的服务提供商之一中有一个“启动”挂钩,该挂钩调用插件中定义的任何“启动挂钩”,以适当地初始化它们。我知道这是一个宽泛的评论,但这是一个宽泛的问题,所以如果您想要更具体的内容,您需要分享有关您的实施如何运作的详细信息。
  • 这里是简单插件的示例pastecode.xyz/view/75d2fa28 在插件加载时调用 boot 并在用户激活此插件时调用 onActivate

标签: php laravel-5 php-7


【解决方案1】:

您可以使用Gate::policy(PolicyTarget::class, PolicyImplementation::class) 在您的插件中注册新的门控策略。

假设您有一个政策目标,例如一个用户(可能是坏例子)。

使用例如创建策略php artisan make:policy UserInteractsWithBlogPolicy

class UserInteractsWithBlogPolicy {
   // Boilerplate and custom code
}

然后你可以在插件启动时注册这个:

 public function boot() {
            // TODO: Implement boot() method.
            $this->enableRoutes();
            $this->enableViews();
            \Gate::policy(User::class, UserInteractsWithBlogPolicy::class); 

}

然后您可以使用正常的策略规则,例如

 $user->can("view", Blog::find(1));

或者基本上按照https://laravel.com/docs/5.6/authorization#authorizing-actions-using-policies能做到的事情去做

【讨论】:

  • 好的,谢谢。现在,我怎样才能获得所有方法注册的策略?我需要这个来生成像这样的列表权限prntscr.com/kiio2w 我需要像 Gate::abilities() 这样的东西,但它不返回在 UserInteractsWithBlogPolicy 中注册的权限
  • 这有点复杂。我的猜测是您应该创建一个 Policy 基类,子类需要实现该基类以返回这些,并且您创建的每个策略都应该实现它,以便您可以在需要时检索它们。据我所知,没有内置的 laravel 方法可以做到这一点,所以你可能需要为这个特定的项目自己编写这个。或者,您可以使用 reflection 获取策略中所有方法的列表
【解决方案2】:

据我从您的问题中了解到,您的 CMS 可能有多个您不想为每个门定义单独的门的门。您可以尝试before 方法来定义动态门。

public function boot(){

      Gate::before(function (User $user, $ability) {
            Gate::define($ability, function (User $user) use ($ability) {
                return $user->hasPermission($ability);
            });
      });

}

在上面的示例中,hasPermission 是用户模型中的一个方法,用于检查用户是否具有正确的权限/能力。

现在你可以在控制器中这样使用它了:

Gate::authorize('CUSTOME_ABILITY');

或作为中间件:

Route::get('/', function (Request $request) {
    // your code
})->can('CUSTOME_ABILITY');

【讨论】:

    猜你喜欢
    • 2022-09-28
    • 2014-03-17
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2014-09-12
    • 2013-06-04
    相关资源
    最近更新 更多