0
  • 地平线版本:^5.7
  • Laravel 版本:^8.18
  • PHP 版本:^8.0
  • Redis 驱动和版本:predis/phpredis ^1.1

描述:

当我尝试为我的授权逻辑使用自定义保护时,我能够从第二个回调参数而不是第一个参数访问经过身份验证的对象。

重现步骤:

namespace App\Providers;

class HorizonServiceProvider extends HorizonApplicationServiceProvider
{
...
  protected function authorization()
    {
        $this->gate();

        Horizon::auth(function ($request) {
            return app()->environment('local') ||
                   Gate::check('viewHorizon', [$request->user('web:admin')]);
                  // used custom guard
        });
    }
  
  protected function gate()
    {
        Gate::define(
          'viewHorizon',
          fn ($user = null, $admin = null) =>
          // 2nd arg = $admin has the authenticated object
          // # unexpected behaviour
            ($admin ? $admin::class : null) == Admin::class
        );
    }
}

这是正常的行为吗?还是我做错了什么?

4

1 回答 1

0

您应该使用 Horizo​​n 配置文件中的自定义防护:config/horizon.php. 就我而言:

<?php

return [
    ...
    'middleware' => ['web','auth:admin'],
    ...
];

然后HorizonServiceProvider你应该检查用户角色:

Gate::define('viewHorizon', function ($user) {
    return $user instanceof AdminUser && $user->isAdmin();
});

请注意,要应用上述 Gate,您应该将环境更改为productionat.env文件。要知道为什么,请看一下vendor/laravel/horizon/src/HorizonApplicationServiceProvider.php

Horizon::auth(function ($request) {
    return app()->environment('local') ||
           Gate::check('viewHorizon', [$request->user()]);
});
于 2021-04-26T04:50:23.530 回答