微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用自定义保护时,门将身份验证模型设置为身份验证回调的第二个参数 说明:重现步骤:

如何解决使用自定义保护时,门将身份验证模型设置为身份验证回调的第二个参数 说明:重现步骤:

  • 地平线版本:^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
        );
    }
}

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

解决方法

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

<?php

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

然后在 HorizonServiceProvider 中,您应该检查用户角色:

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

请注意,要应用上述 Gate,您应该在 production 文件中将环境更改为 .env。要了解原因,请查看vendor/laravel/horizon/src/HorizonApplicationServiceProvider.php

Horizon::auth(function ($request) {
    return app()->environment('local') ||
           Gate::check('viewHorizon',[$request->user()]);
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。