Показывать разные страницы ошибок http, если пользователь аутентифицирован в laravel 6 - PullRequest
0 голосов
/ 07 октября 2019

Я пишу приложение с панелью управления. Я хотел бы сохранить хром панели управления на страницах 404 и 403 при условии, что пользователь вошел в систему. Однако Auth::user() и auth()->id() всегда возвращают null в app/Exceptions/Handler.php, и, очевидно, директивы blade-сервера также не работают какожидается (пользователь всегда выходит из системы)

После небольшого исследования выясняется, что это происходит из-за того, что промежуточное программное обеспечение StartSession не загружено. Похоже, что одним из способов решения этой проблемы является глобальное включение промежуточного программного обеспечения, но это может создать потенциальные проблемы безопасности с маршрутами API.

Поэтому мой вопрос состоит в том, как добавить промежуточное программное обеспечение в Handler.php? Определение конструктора действительно работает. Однако вызов $ this-> middleware (), как в Controllers, не делает. Возможно, есть какой-то другой синтаксис для загрузки промежуточного программного обеспечения

1 Ответ

0 голосов
/ 09 октября 2019

Я понял это благодаря этой теме на github: https://github.com/laravel/framework/issues/17187, особенно комментарии ssddanbrown и DominusVilicus. Но главным образом [ssddanbrown's commit to Bookstack] [1] Я изменил только один файл app / Exceptions / Handler.php

Я добавил

use Illuminate\Http\Request;
use Illuminate\Pipeline\Pipeline;

перед объявлением класса. Создал следующий метод:

/**
* Load Session middleware then run the callback closure and return its result 
*
* @param  \Illuminate\Http\Request $request
* @param  \Closure $callback
* @return \Illuminate\Http\Response
*/
protected function loadSessionMiddleware(Request $request, \Closure $callback)
{
    $pipe = new Pipeline($this->container);

    $middleware = [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    ];

    return $pipe->send($request)->through($middleware)->then($callback);
}

И изменил метод рендеринга следующим образом:

public function render($request, Exception $exception)
{
    if (
        // Only process non API requests' ...
        $request->segment(1) !== 'api' &&
        // ... HTTP exceptions with ...
        $this->isHttpException($exception)
    ) {

        $code = $exception->getStatusCode();
        // ... codes between 400 and 599
        if ($code >= 400 && $code < 600) {

            return $this->loadSessionMiddleware(
                $request,
                function ($request) use ($exception, $code) {

                    // Load error names and descriptions from language files
                    $name = __('http-errors.' . $code . 'n');
                    $desc = __('http-errors.' . $code . 'd');

                    // Display the error page
                    return response()->view(
                        'errors.http',
                        compact('code', 'name', 'desc'),
                        $code
                    );
                }
            );
        }
    }
    return parent::render($request, $exception);

Теперь после этого директивы блейдов @auth и @guest работают как положено в шаблоне,

. .

Примечание. Я использую один шаблон представления и языковые файлы для рендеринга нескольких страниц с ошибками, потому что я ожидаю, что мне придется локализовать мой проект, но содержимое вашей функции обратного вызова и вашего условия может быть немного проще, если вы толькохочу добавить промежуточное ПО на 404 страницы. Что еще более важно, эта часть кода на самом деле не полностью выполняет свою миссию, поскольку не все исключения, которые генерируют ответы HTTP-кода 400-599, являются экземплярами HTTPException, а именно: AuthorizationException и AuthenticationException.

...