Метод auth () null для исключений

Я играл с Laravel 5.4.23, и я столкнулся с этим сценарием, когда я попал на страницу 404 auth(), auth()->check(), auth()->user(), и они не инициализированы, таким образом возвращая null в представлениях или где-то рядом.

я даже пошел в класс AppServiceProvider.php, чтобы провести несколько тестов,

dd(auth()->check());

возвращает Null в методе boot, даже если я вошел в систему, что для меня не имеет смысла.

это означает, что всякий раз, когда пользователь попадает на страницу 404, панели навигации и т. д. не будут отображать данные пользователя, как, например, традиционно у нас есть кнопка профиля пользователя вверху справа на панели навигации, как здесь, в stackoverflow, в этом случае в Laravel это невозможно с тем, что я вижу.

Я на правильном пути или что-то упускаю?

мне кажется, что Laravel пытается войти в систему после завершения тестов запросов.

Надеюсь, я найду здесь ответ.

Спасибо.

ОБНОВЛЕНИЕ:

включение попытки входа вручную в метод boot в App \ Providers \ AppServiceProvider, похоже, исправило нулевую проблему в командах aut (), но я считаю, что это попытается войти в систему дважды за запрос страницы, поскольку, очевидно, Laravel получает зарегистрированный пользователь после загрузки, запросы на исключения и не знаю, что еще.


person Emad Ha    schedule 02.06.2017    source источник


Ответы (1)


Это происходит потому, что сеанс инициализируется группой промежуточного программного обеспечения web. Когда маршрут не найден, промежуточное ПО никогда не инициализируется. Поэтому приложению не удается найти аутентифицированного пользователя из сеанса.

Однако для этого есть обходной путь. Перенос промежуточного программного обеспечения сеанса и файлов cookie из группы промежуточного программного обеспечения web в глобальное промежуточное программное обеспечение, похоже, решает эту проблему. Но оборотной стороной является то, что для каждого маршрута в вашем приложении по умолчанию включены сеансы и файлы cookie. Это может быть проблематично, если у вас есть маршруты api.

ПЕРЕМЕСТИТЬ (не копировать) эти маршруты из web группы промежуточного программного обеспечения ($middlewareGroups) в глобальный список промежуточного программного обеспечения ($middleware).

\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,

Вы можете пропустить EncryptCookies промежуточное ПО, если не хотите обнаруживать пользователей с помощью их запоминающего_ токена на страницах с ошибками.

person Sandeesh    schedule 02.06.2017
comment
это по-прежнему не решает проблему, заключающуюся в том, что в AppServiceProvider Auth :: check () по-прежнему возвращает false, он работает в обработчиках, но не в appserviceprovider, я пытаюсь заглянуть в исходный код laravel, чтобы узнать, есть ли возможный способ загрузить Auth перед остальными - person Emad Ha; 02.06.2017
comment
Зачем вам нужен авторизованный пользователь в сервис-провайдере? - person Sandeesh; 02.06.2017
comment
Мне это действительно не нужно, я просто хочу возиться с исходным кодом laravel, ха-ха, поэтому я пытаюсь понять, как все работает, пока ваше решение сработало, я все еще проверяю их исходный код, 1 неделя laravel пользователь здесь :) - person Emad Ha; 02.06.2017
comment
например, вчера я создал новый вид отношения, который способен работать с таблицами [Users, Freinds], sender_id, recipient_id и т.д., которые ownToMany не может понять, сегодня выскочила ошибка аутентификации :) - person Emad Ha; 02.06.2017
comment
Хорошо, круто. Ваш случай доступа к информации аутентификации на страницах ошибок - это больше, чем обычный сценарий. Но доступа к ним у поставщика услуг d нет. Поставщики услуг - это то, что сначала запускается для загрузки приложения, после чего выполняются другие коды. Так что я не вижу смысла углубляться в это. В любом случае этот вопрос относительно доступа к авторизации на страницах с ошибками решен. - person Sandeesh; 02.06.2017
comment
Я только что заметил, что когда я помещаю их в глобальный список промежуточного программного обеспечения, у меня возникает новая проблема, он создает новый сеанс каждый раз, когда я обновляю страницу, проблема появилась после переноса сеанса в db, однако он каждый раз выводил меня из системы некоторое время, даже с увеличенным временем жизни сеанса, теперь я переместил промежуточное ПО в их обычную веб-группу, и меня больше не выгоняют каждый раз, когда я обновляю страницу, однако мы вернулись к предыдущей проблеме (без авторизации в 404-х) - person Emad Ha; 04.06.2017
comment
@Emad, я только что проверил еще раз, и он отлично работает без очистки сеанса, как вы сказали. Это было то же самое в первый раз, когда я проверил. Я должен иметь отношение к сеансам базы данных. Файловые сеансы, которые я тестировал изначально, работают нормально. - person Sandeesh; 04.06.2017
comment
Я устанавливаю свежий laravel 5.4.23, используя композитор в PhpStormg, и буду запускать его через php artisan serve и тестировать с пустым свежим кодом, чтобы увидеть, является ли это промежуточным программным обеспечением или что-то не так с моим кодом, однако промежуточное программное обеспечение говорит startsession, как В результате я получаю новые строки файла сеанса / базы данных, когда я тестировал сеансы базы данных, при каждом обновлении я скоро вернусь к вам, спасибо. - person Emad Ha; 04.06.2017
comment
@Emad PHP session_start();, позвони в колокольчик? Это просто именование промежуточного программного обеспечения, оно запускает сеанс, что позволяет использовать сеансы. Это не значит, что он сбрасывает и запускает сеанс при каждом запросе. Перемещение промежуточного программного обеспечения из группы web в глобальную не должно создавать каких-либо различий в способах работы сеансов. - person Sandeesh; 04.06.2017
comment
да, но это не только session_start () в этом промежуточном программном обеспечении, любое, что я только что тестировал на свежей копии, и да, я не получаю новый сеанс при каждом обновлении, как в этой другой копии. протестирован как драйвер файла и db, оба в порядке, должно быть что-то я сделал :) спасибо, есть предложения, где искать? - person Emad Ha; 04.06.2017
comment
нашел его, проблема была в ядре, я скопировал промежуточное ПО в глобальные объекты, мне нужно было переместить их в глобальные объекты, мое плохое и еще раз спасибо. - person Emad Ha; 04.06.2017