- Laravel 5.2 — Использование Auth :: check () не работает в MIddleware
- 4 ответа
- Почему не работает Route::middleware(‘auth’)->group()?
- Laravel 5.2 — Using Auth::check() not working in MIddleware
- 4 Answers 4
- Laravel по-русски
- #1 02.07.2017 11:52:13
- Middleware не видит пользователя.
- #2 02.07.2017 12:08:36
- Re: Middleware не видит пользователя.
- #3 02.07.2017 12:41:47
- Re: Middleware не видит пользователя.
- #4 02.07.2017 14:12:26
- Re: Middleware не видит пользователя.
- #5 02.07.2017 14:47:28
- Re: Middleware не видит пользователя.
- #6 02.07.2017 16:46:04
- Re: Middleware не видит пользователя.
- Laravel Framework Russian Community
- Пролог
- Начало работы
- Архитектурные концепции
- Основное
- Погружение
- Безопасность
- База данных
- Eloquent ORM
- Тестирование
- Пакеты
- Посредники (middleware)
- Введение
- Определение посредника
- Посредники и ответы
- Регистрация посредника
- Глобальный стек HTTP-посредников
- Назначение посредников маршрутам
- Группы посредников
- Сортировка посредников
- Параметры посредника
- Завершающий посредник
Laravel 5.2 — Использование Auth :: check () не работает в MIddleware
Я пытаюсь создать промежуточное ПО для разных типов пользователей в своем приложении Laravel 5.2. Итак, я делаю разные промежуточные программы для разных пользователей.
Насколько я знаю, Auth :: check () не будет работать без изучения сети промежуточного программного обеспечения из здесь.
Итак, что я сделал —
routes.php
AdminMiddleware.php
Но я получаю эту ошибку —
Когда » return Auth :: user (); » вызывается внутри промежуточного программного обеспечения, «return Auth :: user ();» работает в другом месте (представление и контроллеры), но не работает как старые версии Laravel.
Кто-нибудь может помочь?
4 ответа
Вы могли бы сделать что-то подобное, при необходимости отрегулируйте
Ошибка, которую вы получаете, возникает из-за того, что вы не возвращаете объект Response из своего промежуточного программного обеспечения. По промежуточного слоя VerifyCsrfToken пытается добавить файл cookie к ответу, который он получает при передаче запроса по конвейеру. В этом случае он получает не объект Response , а вместо этого строку или User , потому что в вашем промежуточном программном обеспечении была возвращена строка или User .
У меня такая же проблема. В моем случае я столкнулся с этим при множественной аутентификации. Если вы используете множественную аутентификацию или даже одну аутентификацию с другим именем первичного ключа в таблице вместо id , это может вызвать.
В Laravel первичный ключ по умолчанию для таблицы пользователей — id . В случае, если вы изменили это на user_id или что-то в этом роде, вы должны упомянуть это в своей модели. Если нет, Laravel не сможет создать сеанс для пользователя, в результате Auth::attempt() будет работать нормально, а Auth::check() — нет. Итак, убедитесь, что вы упомянули об этом внутри класса модели.
Вы также добавили маршруты в веб-группу, поэтому убедитесь, что ваш файл ядра должен иметь следующую группу промежуточного программного обеспечения.
Ошибка из-за сеанса. убедитесь, что ваш файл ядра содержит промежуточное ПО для сеанса.
Привет, @Cowboy и @lagbox, спасибо за попытку помочь, к сожалению, они не работали, но я решил это.
Источник
Почему не работает Route::middleware(‘auth’)->group()?
Пытаюсь сделать простейший пример чтобы страница была доступна только для авторизованных или редиректила на авторизацию.
Вот есть контроллер TestsController
В примере, который я смотрю все работает. Там версия 5.5. laravel. Может проблема в версии? У меня 5.3 — у меня при попытке зайти на /secret показывает 500
- Вопрос задан более двух лет назад
- 640 просмотров
Простой 10 комментариев
Александр Амплеев, вместо заботы о моём здоровье ты бы лучше разобрался с пустыми логами и ещё раз документацию перечитал — лишним не будет.
И в чём проблема использовать актуальную версию ларавел?
Александр Амплеев, ошибок в логах может не быть по двум причинам: ты на unix и не дал права на запись в storage ЛИБО ты специально указал \Exception или \Throwable в noReport в эксепшен хэндлере. В любом случае — ты что-то сделал неправильно.
Лог файл — это обычный текстовый файл, твоя гипотеза — хрень.
На счет актуальной версии — какие проблемы? Гигантский проект на работе на 5.7 LTS, а 5.3 даже не поддерживается уже. Какую-то статистику себе придумал, не знаю нахрена, и, зачем-то, ей проследовал, тоже не знаю нахрена (даже если бы твоя статистика была правдой — ты знаешь причину, по которой юзают 5.3? Или просто предположил? Может это статистика за 2016-ый? Может статистика собрана с проектов, которые вообще не обновляются? Еще что-то?).
И нечего удивлятся ответам Джаоды. Вопрос — элементарный, такой и ответ. Да, ты допустил синтаксическую ошибку. Читал бы доку 5.3 — не было бы вопроса. Обновлялся бы — не было бы вопроса. Юзал бы нормальную IDE — не было бы вопроса.
PS: никакого хейта, я просто отвечаю на твои комментарии
Алексей, спасибо, кэп, я в курсе, почему такое бывает вообще. Но в данном случае я конкретно у автора спрашивал и внятного ответа не получил, одни рассуждения о космических кораблях, бороздящих просторы Большого театра.
P.S. С такими заказчиками можно и не работать, нормальной работы навалом. Конечно, если это не изначально ваш проект на поддержке.
Алексей, ну так все зависит от задач. Попросили АПИ к сайтам или статистику — делай, заказчику плевать что ты там обновить хочешь. Обновление для него — чистые убытки. А если не хочешь возится с легаси — отказывайся от такой работы, как сказал JhaoDa.
Только если ты прочитаешь то говнецо, которое начал втирать нам автор, ты поймешь, что речь совсем не об поддержке легаси из-за заказчика, а вполне себе сознательный выбор разработчика, потому что он в каком-то видео уроке трехлетней давности увидел 5.3 и использовал, а теперь пытается оправдать это какой-то «статистикой».
Источник
Laravel 5.2 — Using Auth::check() not working in MIddleware
I am trying to make a middleware for different type of users in my Laravel 5.2 app. So, what is I am doing is making different middlewares for different users.
As far as I am knowing Auth::check() will not work without musing middleware web from here.
So, what I have done is-
routes.php
AdminMiddleware.php
Kernel.php
AdminController.php
But I am getting this error-
when «return Auth::user();» called inside middleware, «return Auth::user();» is working in other place (view and controllers) but not working like old versions of Laravel.
Can anyone please help?
4 Answers 4
You could potentially do something like this, adjust where needed
The error you are receiving is coming from the fact that you are not returning a Response object from your middleware. The VerifyCsrfToken middleware is trying to add a cookie to the response it gets from passing the request down the pipeline. In this case it is not getting a Response object but instead a string or User because a string or User was returned in your middleware.
Hi @Cowboy and @lagbox , Thanks for trying to help, unfortunately they were not working, but I have solved it.
I have solved it by running-
php artisan clear-compiled
php artisan optimize
and then middleware-
You have added routes in web group as well so make sure your kernel file should have following middleware group.
The error due to session. make sure your kernel file contains session middlewares.
I’ve the same issue. In my case, I’m facing this in Multiple authentication. If you’re using Multiple authentications or even single authentication with different primary key name in the table instead of id , This may cause.
In Laravel, the default primary key for the users table is id . In case, you’ve changed that into user_id or something, You have to mention that in your Model. If not, Laravel can’t create the session for the user as a result, the Auth::attempt() will work fine but Auth::check() will not. So, Make sure you’ve mentioned that inside the model class.
Источник
Laravel по-русски
Русское сообщество разработки на PHP-фреймворке Laravel.
#1 02.07.2017 11:52:13
Middleware не видит пользователя.
Зарегал пользователя admin. Везде на страницах он определяется:
Auth::check() — true
Auth::user() — данные пользователя
Request::user() — данные пользователя
Создал middleware Admin, и в нём (даже после авторизации) получаю такие результаты:
Auth::check() — false
Auth::user() — null
Request::user() — null
Где я туплю? Направьте, пожалуйста.
Изменено overman (02.07.2017 16:51:29)
Не в сети 07.06.2016
#2 02.07.2017 12:08:36
Re: Middleware не видит пользователя.
По уму, наверное код посредника надо показать
Не в сети 12.02.2016
#3 02.07.2017 12:41:47
Re: Middleware не видит пользователя.
Изменено overman (02.07.2017 13:57:05)
Не в сети 07.06.2016
#4 02.07.2017 14:12:26
Re: Middleware не видит пользователя.
пользователь на реквесте появляется тоже в результате работы миддлварей – если посмотреть в группу миддлварей web, там есть те что отвечают за сессии пользователей в том числе. просто твоя миддлварь отрабатывает слишком рано, до того как сессия будет прочитана из кук и информация об авторизации будет доступна…
Не в сети 19.02.2015
#5 02.07.2017 14:47:28
Re: Middleware не видит пользователя.
просто твоя миддлварь отрабатывает слишком рано
Простите, не доходит, как сделать, чтобы она отрабатывала позже.
Не в сети 07.06.2016
#6 02.07.2017 16:46:04
Re: Middleware не видит пользователя.
наверное надо смотреть где и как она подключена. если ты её добавил в группу web, то она должна быть добавлена в конце группы. если задана для маршрута – должна идти после группы web. если назначается через конструктор контроллера – если честно не помню как там определяется порядок их запуска
по-моему определить группу маршрутов с общим префиксом для url и общей миддлварью на проверку доступа – самый простой и надёжный вариант.
не вижу версии ларавеля в теме, если 5.4 то в файле маршрутов web.php что-то типа
кстати, а почему не хочешь использовать родной функционал контроля доступа?
у меня в случаях когда пользователь просто или админ или нет, доступ в админку даётся через стандартную миддлварь. для этого в app/Providers/AuthServiceProvider.php добавляется в boot() что-то типа
и после этого на маршрутах определяется группа с миддлварью can (стандартная для ларавеля):
теперь все маршруты внутри /admin отдают 403 если пользователь авторизован и is_admin == false
Источник
Laravel Framework Russian Community
Пролог
Начало работы
Архитектурные концепции
Основное
Погружение
Безопасность
База данных
Eloquent ORM
Тестирование
Пакеты
Посредники (middleware)
Введение
Посредник обеспечивает удобный механизм для проверки и фильтрации HTTP-запросов, поступающих в ваше приложение. Например, в Laravel уже содержится посредник, проверяющий аутентификацию пользователя вашего приложения. Если пользователь не аутентифицирован, то посредник перенаправит пользователя на экран входа в ваше приложение. Однако, если пользователь аутентифицирован, то посредник позволит запросу продолжить работу в приложении.
Посредник может быть написан для выполнения различных задач помимо аутентификации. Например, посредник для ведения журнала может регистрировать все входящие запросы вашего приложения. В состав фреймворка Laravel уже входят несколько посредников, включая посредник для аутентификации и посредник для защиты от CSRF. Все эти посредники находится в каталоге app/Http/Middleware .
Определение посредника
Чтобы создать нового посредника, используйте команду make:middleware Artisan:
Эта команда поместит новый класс посредника в каталог app/Http/Middleware вашего приложения. В этом посреднике мы будем разрешать доступ к маршруту только в том случае, если значение входящего token соответствует указанному. В противном случае мы перенаправим пользователя по маршруту home :
Как видите, если переданный token не совпадает с нашим секретным токеном, то посредник вернет клиенту HTTP-перенаправление; в противном случае запрос будет передан в приложение. Чтобы передать запрос дальше в приложение (позволяя «пройти» посредника), вы должны вызвать замыкание $next с параметром $request .
Лучше всего представить себе посредников как серию «слоев» для HTTP-запроса, которые необходимо пройти, прежде чем запрос попадет в ваше приложение. Каждый слой может рассмотреть запрос и даже полностью отклонить его.
Все посредники извлекаются из контейнера служб, поэтому вы можете объявить необходимые вам зависимости в конструкторе посредника.
Посредники и ответы
Конечно, посредник может выполнять задачи до или после передачи запроса в приложение. Например, следующий посредник будет выполнять некоторую задачу до того, как запрос будет обработан приложением:
Однако, этот посредник будет выполнять свою задачу после обработки входящего запроса приложением:
Регистрация посредника
Глобальный стек HTTP-посредников
Если вы хотите, чтобы посредник запускался во время каждого HTTP-запроса к вашему приложению, то укажите класс посредника в свойстве $middleware вашего класса app/Http/Kernel.php .
Назначение посредников маршрутам
Если вы хотите назначить посредника определенным маршрутам, то вам следует сначала зарегистрировать ключ посредника в файле app/Http/Kernel.php вашего приложения. По умолчанию свойство $routeMiddleware этого класса содержит записи для посредников, уже включенных в состав Laravel. Вы можете добавить свой собственный посредник в этот список, и назначить ему ключ по вашему выбору:
После того, как посредник был определен в HTTP-ядре, вы можете использовать метод middleware для назначения посредника маршруту:
Вы можете назначить несколько посредников маршруту, передав массив имен посредников методу middleware :
Вы можете назначить посредника, передав полное имя класса:
При назначении посредника группе маршрутов, иногда может потребоваться запретить применение посредника к одному из маршрутов в группе. Вы можете сделать это с помощью метода withoutMiddleware :
Метод withoutMiddleware удаляет только посредника маршрутизации и не применим к глобальному посреднику.
Группы посредников
По желанию можно сгруппировать несколько посредников под одним ключом, чтобы упростить их назначение маршрутам. Вы можете сделать это, используя свойство $middlewareGroups вашего HTTP-ядра.
По умолчанию Laravel поставляется с группами посредников web и api , которые содержат основных посредников, которые вы, возможно, захотите применить к своим веб- и API-маршрутам. Помните, что эти группы посредников автоматически применяются поставщиком служб App\Providers\RouteServiceProvider вашего приложения к маршрутам, определенным в файлах маршрутов web и api , соответственно:
Группы посредников могут быть назначены маршрутам и действиям контроллера с использованием того же синтаксиса, что и для отдельных посредников. Опять же, группы посредников делают более удобным одновременное назначение нескольких посредников для маршрута:
Из коробки группы посредников web и api автоматически применяются к соответствующим файлам вашего приложения routes/web.php и routes/api.php с помощью App\Providers\RouteServiceProvider .
Сортировка посредников
В редких случаях, может понадобиться, чтобы посредники выполнялись в определенном порядке, но вы не можете контролировать их порядок, когда они назначены маршруту. В этом случае вы можете указать приоритет посредников, используя свойство $middlewarePriority вашего файла app/Http/Kernel.php . Это свойство может отсутствовать в вашем HTTP-ядре по умолчанию. Если оно не существует, то вы можете скопировать его определение по умолчанию ниже:
Параметры посредника
Посредник также может получать дополнительные параметры. Например, если вашему приложению необходимо проверить, что аутентифицированный пользователь имеет конкретную «роль» перед выполнением им конкретного действия, то вы можете создать посредника, например, EnsureUserHasRole , который получит имя роли в качестве дополнительного аргумента.
Дополнительные параметры посредника будут переданы после аргумента $next :
Параметры посредника можно указать при определении маршрута, разделив имя посредника и параметры символом : . Несколько параметров следует разделять запятыми:
Завершающий посредник
Иногда посреднику может потребоваться выполнить некоторую работу после отправки HTTP-ответа в браузер. Если вы определите метод terminate в своем посреднике и при условии, что ваш веб-сервер использует FastCGI, то метод terminate будет автоматически вызван после отправки ответа в браузер:
Метод terminate должен получать и запрос, и ответ. После того, как вы определили завершающий посредник, вы должны добавить его в список маршрутов или глобальный стек посредников в файле app/Http/Kernel.php .
При вызове метода terminate посредника, Laravel извлечет новый экземпляр посредника из контейнера служб. Если вы хотите использовать один и тот же экземпляр посредника при вызове методов handle и terminate , то зарегистрируйте посредника в контейнере, используя метод контейнера singleton . Обычно это должно быть сделано в методе register вашего AppServiceProvider :
Источник