在生产环境中运行laravel horizon,在请求域/horizon时抛出403错误

zed5wv10  于 2022-12-01  发布在  其他
关注(0)|答案(5)|浏览(372)

我已经在本地环境中测试了laravel Horizon,一切都按预期运行。当我切换到生产域/Horizon时,抛出了403错误。我已经按照文档中的说明在HorizonServiceProvider中设置了门-第一步只是在没有身份验证的情况下获得访问权限。我的门现在如下所示:

{
    Gate::define('viewHorizon', function ($user = null) {
        return true;
    });
}

有人能告诉我我错过了什么吗?
link to 403 errorlink to 401 error - Dashboard without data显示器

sdnqo3pr

sdnqo3pr1#

查看此GitHub评论:https://github.com/laravel/horizon/issues/563#issuecomment-480882947
您可能需要注册Horizon的服务提供商。
config/app.php中:

'providers' => [
        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
    ...
        App\Providers\TelescopeServiceProvider::class,
        App\Providers\HorizonServiceProvider::class,
    ],
kxe2p93d

kxe2p93d2#

这个错误是因为horizon它首先进入了boot方法,所以我建议你在HorizonServiceProvider.php中编辑boot方法,以允许你这样的请求:

/**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();

        Horizon::auth(function ($request) {
            if ($request->ajax()){
                return true;
            }
            else if (isset($request->let_me_go) && $request->let_me_go == 'ok'){
                return true;
            }else{
                throw new UnauthorizedHttpException('Unauthorized');
            }
        });
    }

所以当你要转到你的生产服务器时需要传递这样的参数:

我的生产站点.com/地平线/ Jmeter 板?让我走=好

rt4zxlrg

rt4zxlrg3#

您需要将以下方法添加到App\Providers\HorizonServiceProvider类:

class HorizonServiceProvider extends ServiceProvider {
    
    // ...

    protected function authorization()
    {
        Horizon::auth(function () {
            return true;
        });
    }
}

这个方法会覆写验证HTTP要求的父方法。

h43kikqp

h43kikqp4#

对我来说,问题是我在app\Providers\HorizonServiceProvider.php中设置了:

/**
 * Register the Horizon gate.
 *
 * This gate determines who can access Horizon in non-local environments.
 *
 * @return void
 */
protected function gate() {
    Gate::define('viewHorizon', function ($user) {//https://laravel.com/docs/7.x/horizon#dashboard-authorization            
        return $user->id === \App\Constants\Permissions::ADMIN_USER_ID;
    });
}

然后我忘记了我需要登录example.com/login才能被允许访问example.com/horizon。
请https://github.com/laravel/horizon/issues/563#issuecomment-500821983访问https://laravel.com/docs/8.x/horizon#dashboard-authorization

epggiuax

epggiuax5#

删除authorization()方法中的第二个参数[$request->user()]允许执行Gate check()。否则,无论define()函数中有什么,它总是返回false

/**
 * Configure the Horizon authorization services.
 *
 * @return void
 */
protected function authorization()
{
    $this->gate();

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

/**
 * Register the Horizon gate.
 *
 * This gate determines who can access Horizon in non-local environments.
 *
 * @return void
 */
protected function gate()
{
    Gate::define('viewHorizon', function ($user = null) {
        return $user->isAdmin();
    });
}

相关问题