Недавно я создал новый проект Laravel и следил за руководством по аутентификации. Когда я посещаю свой логин или маршрут регистрации, я получаю следующую ошибку:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
Я не редактировал никаких основных файлов Laravel, я только создал представления и добавил маршруты в свой файл routes.php
// Authentication routes
Route::get('auth/login', ['uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Route::post('auth/login', ['uses' => 'Auth\AuthController@postLogin', 'as' => 'login']);
Route::get('auth/logout', ['uses' => 'Auth\AuthController@getLogout', 'as' => 'logout']);
// Registration routes
Route::get('auth/register', ['uses' => 'Auth\AuthController@getRegister', 'as' => 'register']);
Route::post('auth/register', ['uses' => 'Auth\AuthController@postRegister', 'as' => 'login']);
У меня нет большого опыта работы с Laravel, поэтому, пожалуйста, извините за мое незнание. Я знаю, что есть еще один вопрос, задающий то же самое, но ни один из ответов, похоже, не работает для меня. Спасибо за прочтение!
Редактировать:
Вот мой register.blade.php в соответствии с просьбой.
@extends('partials.main')
@section('title', 'Test | Register')
@section('content')
<form method="POST" action="/auth/register">
{!! csrf_field() !!}
<div class="ui input">
<input type="text" name="name" value="{{ old('name') }}" placeholder="Username">
</div>
<div class="ui input">
<input type="email" name="email" value="{{ old('email') }}" placeholder="Email">
</div>
<div class="ui input">
<input type="password" name="password" placeholder="Password">
</div>
<div class="ui input">
<input type="password" name="password_confirmation"placeholder="Confirm Password">
</div>
<div>
<button class="ui primary button" type="submit">Register</button>
</div>
</form>
@endsection
Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController', ]);
Ответы:
Вам нужно будет использовать промежуточное веб-программное обеспечение, если вам нужно состояние сеанса, защита CSRF и многое другое.
источник
php artisan key:generate
Если добавление
routes
внутриweb middleware
не работает по какой-либо причине, попробуйте добавить это$middleware
вKernel.php
источник
В моем случае (с использованием Laravel 5.3) добавление только следующих двух промежуточных программ позволило мне получить доступ к данным сеанса в моих маршрутах API:
\App\Http\Middleware\EncryptCookies::class
\Illuminate\Session\Middleware\StartSession::class
Полное объявление (
$middlewareGroups
в Kernel.php):источник
Если ответ Каса Блума неприменим (т.е. у вас определенно есть
web
промежуточное программное обеспечение на соответствующем маршруте), вы можете проверить порядок промежуточного программного обеспечения в своем HTTP-ядре.Порядок по умолчанию
Kernel.php
следующий:Обратите внимание, что
VerifyCsrfToken
идет послеStartSession
. Если они расположены в другом порядке, зависимость между ними также может привести кSession store not set on request.
исключению.источник
Проблема может заключаться в том, что вы пытаетесь получить доступ к сеансу внутри функции вашего контроллера
__constructor()
.Начиная с Laravel 5.3+ это больше невозможно, потому что оно не предназначено для работы, как указано в руководстве по обновлению .
Для получения дополнительной справочной информации также прочтите его ответ Тейлора .
Обходной путь
Если вы все еще хотите использовать это, вы можете динамически создать промежуточное ПО и запустить его в конструкторе, как описано в руководстве по обновлению:
источник
Laravel [5.4]
Мое решение заключалось в использовании глобального помощника сеанса : session ()
Его функциональность немного сложнее, чем $ request-> session () .
письмо :
толкание :
получение :
источник
В моем случае я добавил следующие 4 строки в $ middlewareGroups (в app / Http / Kernel.php):
ВАЖНО: 4 новые строки должны быть добавлены ДО 'throttle' и 'bindings'!
В противном случае возникнет ошибка «CSRF token not match». Я боролся с этим несколько часов, просто чтобы убедиться, что порядок важен.
Это позволило мне получить доступ к сеансу в моем API. Я также добавил VerifyCsrfToken, поскольку при использовании файлов cookie / сеансов необходимо позаботиться о CSRF.
источник
Вы можете использовать
->stateless()
до->redirect()
. Тогда вам больше не нужен сеанс.источник
в моем случае просто поставить возврат; в конце функции, где я установил сеанс
источник
Если вы используете CSRF, введите
'before'=>'csrf'
В твоем случае
Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Для получения более подробной информации просмотрите документацию Laravel 5. Безопасность, защищающая маршруты.
источник
Этого нет в документации laravel, у меня был час, чтобы добиться этого:
Моя сессия не сохранялась, пока я не использовал метод «сохранить» ...
источник
Группа веб-промежуточного программного обеспечения Laravel 5.3+ автоматически применяется к вашему файлу routes / web.php с помощью RouteServiceProvider.
Если вы не измените массив ядра $ middlewareGroups в неподдерживаемом порядке, вероятно, вы пытаетесь внедрить запросы как обычную зависимость от конструктора.
Использовать запрос как
вместо того
источник
Я получал эту ошибку с Laravel Sanctum. Я исправил это, добавив
\Illuminate\Session\Middleware\StartSession::class,
в группуapi
промежуточного программного обеспечения в Kernel.php, но позже я понял, что это «сработало», потому чтоapi.php
вместо этого были добавлены мои маршруты аутентификацииweb.php
, поэтому Laravel использовал неправильную защиту авторизации .Я переместил эти маршруты сюда,
web.php
и они начали корректно работать сAuthenticatesUsers.php
трейтом:Я понял проблему после того, как получил еще одну странную ошибку о том,
RequestGuard::logout()
что не существует.Это заставило меня понять, что мои настраиваемые маршруты аутентификации вызывают методы из трейта AuthenticatesUsers, но я не использовал его
Auth::routes()
для этого. Затем я понял, что Laravel по умолчанию использует веб-защиту, а это значит, что маршруты должны быть внутриroutes/web.php
.Вот как теперь выглядят мои настройки с Sanctum и несвязанным приложением Vue SPA:
Kernel.php
config / auth.php
Тогда вы можете иметь юнят тесты , такие как это, где критически
Auth::check()
,Auth::user()
иAuth::logout()
работа , как ожидается , с минимальной конфигурацией и максимальным использованиемAuthenticatesUsers
иRegistersUsers
чертами.Вот несколько моих модульных тестов входа в систему:
TestCase.php
LoginTest.php
Я перекрытый
registered
иauthenticated
методы в AUTH черте Laravel так , что они возвращают объект пользователя , а не только 204 ВАРИАНТОВ:Посмотрите на код поставщика для признаков аутентификации. Вы можете использовать их нетронутыми, а также два вышеуказанных метода.
Вот мои действия Vuex Vue SPA для входа в систему:
Мне потребовалось больше недели, чтобы получить модульные тесты Laravel Sanctum + Vue SPA + auth с тем же доменом, которые работают в соответствии с моими стандартами, поэтому, надеюсь, мой ответ здесь поможет сэкономить время других в будущем.
источник