wake-up-neo.net

Laravel - Sitzungsspeicher nicht auf Anforderung festgelegt

Ich habe vor kurzem ein neues Laravel-Projekt erstellt und folgte dem Leitfaden zur Authentifizierung. Wenn ich meine Login- oder Registrierungsroute besuche, erhalte ich die folgende Fehlermeldung:

ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)

Ich habe keine Kern-Laravel-Dateien bearbeitet, ich habe nur die Ansichten erstellt und die Routen meiner routes.php-Datei hinzugefügt

// Authentication routes
Route::get('auth/login', ['uses' => 'Auth\[email protected]', 'as' => 'login']);
Route::post('auth/login', ['uses' => 'Auth\[email protected]', 'as' => 'login']);
Route::get('auth/logout', ['uses' => 'Auth\[email protected]', 'as' => 'logout']);

// Registration routes
Route::get('auth/register', ['uses' => 'Auth\[email protected]', 'as' => 'register']);
Route::post('auth/register', ['uses' => 'Auth\[email protected]', 'as' => 'login']);

Ich habe nicht viel Erfahrung mit Laravel, entschuldigen Sie bitte meine Unwissenheit. Ich bin mir bewusst, dass eine andere Frage dasselbe verlangt, aber keine der Antworten scheint für mich zu funktionieren. Danke fürs Lesen!

Bearbeiten:

Hier ist mein register.blade.php wie gewünscht.

@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
81
mattrick

Sie müssen die Web-Middleware verwenden, wenn Sie Sitzungsstatus, CSRF-Schutz und mehr benötigen.

Route::group(['middleware' => ['web']], function () {
    // your routes here
});
123
Cas Bloem

Wenn das Hinzufügen Ihrer routes im web middleware aus irgendeinem Grund nicht funktioniert, versuchen Sie, dies zu $middleware in Kernel.php hinzuzufügen

protected $middleware = [
        //...
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];
37
Waiyl Karim

In meinem Fall (unter Verwendung von Laravel 5.3) konnte ich durch das Hinzufügen der folgenden 2 Middleware auf die Sitzungsdaten meiner API-Routen zugreifen:

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

Vollständige Deklaration ($middlewareGroups in Kernel.php):

'api' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Session\Middleware\StartSession::class,
            'throttle:60,1',
            'bindings',
        ],
30
George Kagan

Wenn die Antwort von Cas Bloem nicht zutrifft (d. H. Sie haben definitiv die web-Middleware auf der entsprechenden Route), möchten Sie möglicherweise die Reihenfolge der Middlewares in Ihrem HTTP-Kernel überprüfen.

Die Standardreihenfolge in Kernel.php lautet:

$middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],
];

Beachten Sie, dass VerifyCsrfToken hinter StartSession steht. Wenn Sie diese in einer anderen Reihenfolge haben, kann die Abhängigkeit zwischen ihnen auch zur Session store not set on request.-Ausnahme führen. 

17

Laravel [5.4]

Meine Lösung war die Verwendung eines globalen Sitzungshelfer: session ()

Seine Funktionalität ist etwas schwieriger als $ request-> session ().

schreiben:

session(['key'=>'value']);

Drücken von:

session()->Push('key', $notification);

abrufen:

session('key');
11
izzaki

Ein Problem kann sein, dass Sie versuchen, auf Ihre Sitzung innerhalb der __constructor()-Funktion Ihres Controllers zuzugreifen.

Ab Laravel 5.3+ ist dies nicht mehr möglich, da es ohnehin nicht dazu gedacht ist, wie in der Upgrade-Anleitung angegeben .

In früheren Versionen von Laravel konnten Sie auf Sitzungsvariablen oder .__ zugreifen. der authentifizierte Benutzer im Konstruktor Ihres Controllers. Das war nie beabsichtigt, ein explizites Merkmal des Rahmens zu sein. In Laravel 5.3 Sie können nicht auf die Sitzung oder den authentifizierten Benutzer im Konstruktor Ihres Controllers zugreifen, da die Middleware noch nicht ausgeführt wurde.

Für weitere Hintergrundinformationen lesen Sie auch Taylor seine Antwort.

Problemumgehung

Wenn Sie dies dennoch verwenden möchten, können Sie eine Middleware dynamisch erstellen und im Konstruktor ausführen, wie in der Upgrade-Anleitung beschrieben:

Alternativ können Sie direkt eine Closure-basierte Middleware definieren im Konstruktor Ihres Controllers. Stellen Sie vor der Verwendung dieser Funktion sicher, dass dass Ihre Anwendung Laravel 5.3.4 oder höher ausführt:

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class ProjectController extends Controller
{
    /**
     * All of the current user's projects.
     */
    protected $projects;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;

            return $next($request);
        });
    }
}
11
Daan

In meinem Fall habe ich $ middlewareGroups (in app/Http/Kernel.php) die folgenden 4 Zeilen hinzugefügt:

'api' => [
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
    'throttle:60,1',
    'bindings',
],

WICHTIG: Die 4 neuen Zeilen müssen VOR 'Gas' und 'Bindungen' hinzugefügt werden!

Andernfalls tritt der Fehler "CSRF-Token stimmt nicht überein" auf. Ich habe mehrere Stunden damit gekämpft, nur um herauszufinden, dass die Reihenfolge wichtig ist.

Dadurch konnte ich in meiner API auf die Sitzung zugreifen. Außerdem habe ich VerifyCsrfToken hinzugefügt, da CSRF bei Cookies/Sitzungen berücksichtigt werden muss.

0
莊育銘

Können Sie ->stateless() vor der ->redirect() verwenden? Dann brauchen Sie die Sitzung nicht mehr.

0
Henrique Duarte

in meinem Fall war es nur zu setzen am ende der funktion, wo ich die session eingestellt habe 

0

Wenn Sie CSRF verwenden, geben Sie 'before'=>'csrf' ein.

In Ihrem Fall Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\[email protected]', 'as' => 'login']);

Weitere Informationen finden Sie in der Laravel 5-Dokumentation Sicherheitsschutzwege

0