Laravel 5.7: пользователь не установлен при создании исключения NotFoundHttpException - PullRequest
0 голосов
/ 30 января 2019

Я переопределяю рендеринг пары исключений в App\Exceptions\Handler, чтобы я мог возвращать пользовательские страницы ошибок.Однако в некоторых исключениях auth()->user() - это , а не .

В методе render я просто выгружаю пользователя следующим образом:

public function render($request, Exception $exception)
{
    dd(auth()->user());

    return parent::render($request, $exception);
}

Когда исключения относятся к типу NotFoundHttpException,, пользователь не установлен.Что было бы лучшим решением для получения пользователя в этих исключениях?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вот решение, но читайте другую рекомендацию.

По умолчанию аутентификация Laravel выполняется через сеанс.Сеанс явно запускается в группе промежуточного программного обеспечения web .

Если маршрут не включен в группу промежуточного программного обеспечения web (как может существовать несуществующий маршрут / 404)промежуточное программное обеспечение не запускается, и сеанс не запускается.Поэтому Laravel не может знать, существует ли пользователь сеанса.

Лучшее решение: определить запасной маршрут , который был построен именно для этой цели.

Еще одно решение с учетом проблем: Перемещение промежуточного программного обеспечения StartSession в глобальную группу, которая выполняется при каждом запросе.

/ app / Http / Kernel.php:

/**
 * The application's global HTTP middleware stack.
 *
 * These middleware are run during every request to your application.
 *
 * @var array
 */
protected $middleware = [
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
    // +++ MOVED SESSION START HERE BELOW +++
    \Illuminate\Session\Middleware\StartSession::class,
];

Но, если вы ...?

Во-первых, есть причина, по которой сеанс не загружается по каждому запросу по умолчанию: он создает дополнительные издержки, которые могут не понадобиться при каждом запросе.Например, если ваш веб-сайт настроен на постоянное использование Laravel в качестве обработчика запросов, каждые 404 будут маршрутизировать через Laravel.И их очень много - сканеры и боты постоянно ищут в Интернете известные небезопасные пути.Посмотрите журналы доступа.

Кроме того, если вы создаете автономные страницы ошибок, которые не зависят от логики внешнего приложения, вы можете повторно использовать их на уровне сервера.Если Apache или Nginx выдает ошибку, Laravel вообще не будет там, чтобы продиктовать вывод.

TL; DR: Вы можете включить сеансы на 404 и других страницах, но поймите компромиссы.Лично я рекомендую избегать логики приложения на страницах ошибок.

0 голосов
/ 30 января 2019

Попробуйте:

Auth::user()

Это должно работать так же.Убедитесь, что вы используете библиотеку Auth .

...