Recentemente criei um novo projeto Laravel e estava seguindo o guia de Autenticação. Quando visito minha rota de login ou registro, recebo o seguinte erro:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
Eu não editei nenhum arquivo principal do Laravel, apenas criei as visualizações e adicionei as rotas ao meu arquivo 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']);
Não tenho muita experiência com o Laravel, então desculpe minha ignorância. Estou ciente de que há outra pergunta fazendo a mesma coisa, mas nenhuma das respostas parece funcionar para mim. Obrigado por ler!
Editar:
Aqui está meu register.blade.php conforme solicitado.
@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', ]);
Respostas:
Você precisará usar o middleware da web se precisar de estado de sessão, proteção CSRF e muito mais.
fonte
php artisan key:generate
Se adicionar o seu
routes
dentro doweb middleware
não trabalho por qualquer motivo, em seguida, tente adicionar isso$middleware
emKernel.php
fonte
No meu caso (usando o Laravel 5.3) adicionar apenas os 2 seguintes middleware me permitiu acessar os dados da sessão em minhas rotas de API:
\App\Http\Middleware\EncryptCookies::class
\Illuminate\Session\Middleware\StartSession::class
Declaração completa (
$middlewareGroups
em Kernel.php):fonte
Se a resposta de Cas Bloem não se aplica (ou seja, você definitivamente tem o
web
middleware na rota aplicável), você pode querer verificar a ordem dos middlewares em seu kernel HTTP.A ordem padrão
Kernel.php
é esta:Observe que
VerifyCsrfToken
vem depoisStartSession
. Se você os tiver em uma ordem diferente, a dependência entre eles também pode levar àSession store not set on request.
exceção.fonte
Um problema pode ser que você tente acessar sua sessão dentro da
__constructor()
função de seu controlador .A partir do Laravel 5.3+, isso não é mais possível porque não foi projetado para funcionar de qualquer maneira, conforme declarado no guia de atualização .
Para obter mais informações básicas, leia também a resposta de Taylor .
Gambiarra
Se ainda quiser usar isso, você pode criar dinamicamente um middleware e executá-lo no construtor, conforme descrito no guia de upgrade:
fonte
Laravel [5.4]
Minha solução foi usar o helper de sessão global: session ()
Sua funcionalidade é um pouco mais difícil do que $ request-> session () .
escrevendo :
empurrando :
recuperando :
fonte
No meu caso, adicionei as seguintes 4 linhas a $ middlewareGroups (em app / Http / Kernel.php):
IMPORTANTE: As 4 novas linhas devem ser adicionadas ANTES de 'throttle' e 'bindings'!
Caso contrário, aparecerá um erro "token CSRF não correspondente". Lutei nisso por várias horas só para descobrir que a ordem é importante.
Isso me permitiu acessar a sessão em minha API. Também adicionei VerifyCsrfToken, pois quando cookies / sessões estão envolvidos, CSRF precisa ser cuidado.
fonte
Você pode usar
->stateless()
antes do->redirect()
. Então você não precisa mais da sessão.fonte
no meu caso era só colocar retorno; no final da função onde eu configurei a sessão
fonte
Se você estiver usando CSRF, digite
'before'=>'csrf'
No seu caso
Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Para mais detalhes veja Laravel 5 Documentação Segurança Protegendo Rotas
fonte
Não está na documentação do laravel, levei uma hora para conseguir isso:
Minha sessão não persistiu até que usei o método "salvar" ...
fonte
O grupo de middleware da web do Laravel 5.3+ é automaticamente aplicado ao seu arquivo routes / web.php pelo RouteServiceProvider.
A menos que você modifique o array $ middlewareGroups do kernel em uma ordem não suportada, provavelmente você está tentando injetar solicitações como uma dependência regular do construtor.
Use a solicitação como
ao invés de
fonte
Eu estava recebendo este erro com o Laravel Sanctum. Corrigi isso adicionando
\Illuminate\Session\Middleware\StartSession::class,
aoapi
grupo de middleware em Kernel.php, mas depois descobri que isso "funcionou" porque minhas rotas de autenticação foram adicionadas aoapi.php
invés deweb.php
, então o Laravel estava usando o protetor de autenticação errado.Mudei essas rotas aqui para
web.php
e então elas começaram a funcionar corretamente com aAuthenticatesUsers.php
característica:Eu descobri o problema depois de receber outro erro estranho sobre
RequestGuard::logout()
não existe.Isso me fez perceber que minhas rotas de autenticação personalizadas são métodos de chamada do traço AuthenticatesUsers, mas eu não estava usando
Auth::routes()
para fazer isso. Então percebi que o Laravel usa o web guard por padrão e isso significa que as rotas devem estar ativadasroutes/web.php
.É assim que minhas configurações parecem agora com Sanctum e um aplicativo Vue SPA desacoplado:
Kernel.php
config / auth.php
Então você pode ter testes de unidade como esta, onde criticamente,
Auth::check()
,Auth::user()
, eAuth::logout()
funcionam como esperado com configuração mínima e uso máximo deAuthenticatesUsers
eRegistersUsers
traços.Aqui estão alguns dos meus testes de unidade de login:
TestCase.php
LoginTest.php
Eu substituí os métodos
registered
eauthenticated
nas características de autenticação do Laravel para que eles retornem o objeto do usuário em vez de apenas as 204 OPÇÕES:Observe o código do fornecedor para as características de autenticação. Você pode usá-los intactos, além dos dois métodos acima.
Aqui estão as ações do Vuex do Vue SPA para login:
Levei mais de uma semana para fazer com que os testes de unidade Laravel Sanctum + Vue SPA + auth de mesmo domínio funcionassem de acordo com o meu padrão, então espero que minha resposta aqui possa ajudar outros a economizar tempo no futuro.
fonte