Laravel 5.4 - хранилище сеансов не установлено по запросу

На моем производственном сервере Laravel 5.4 я забыл запустить команду php artisan config:cache после того, как реализовал систему множественной авторизации. Все это работает в моей среде разработки, но не хочет работать. С момента запуска команды cache я проработал все ошибки до этого момента. Однако я застрял на этом и действительно не уверен, где взять его. Любую информацию, которую я не предоставил, пожалуйста, не стесняйтесь спрашивать, и я опубликую ее. Спасибо большое за вашу помощь.

namespace App\Exceptions;

use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    protected $dontReport = [
        \Illuminate\Auth\AuthenticationException::class,
        \Illuminate\Auth\Access\AuthorizationException::class,
        \Symfony\Component\HttpKernel\Exception\HttpException::class,
        \Illuminate\Database\Eloquent\ModelNotFoundException::class,
        \Illuminate\Session\TokenMismatchException::class,
        \Illuminate\Validation\ValidationException::class,
    ];

    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }

    /**
     * Convert an authentication exception into an unauthenticated response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Auth\AuthenticationException  $exception
     * @return \Illuminate\Http\Response
     */
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }

        $guard=array_get($exception->guards(),0);

        switch ($guard) {
            case 'admin':
                $login='admin.login';
                break;

            default:
                $login='login';
                break;
        }
        return redirect()->guest(route($login));
    }
}


namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    public function handle($request, Closure $next, $guard = null)
    {
     switch ($guard) {
        case 'admin':
          if (Auth::guard($guard)->check()) {   
            return redirect()->route('admin');
                     }          
          break;

        default:
          if (Auth::guard($guard)->check()) {    
            return redirect('/user');
          }
          break;
      }
        return $next($request);
    }
}



namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

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

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
}



RuntimeException in Request.php line 388:Session store not set on request.
1.  in Request.php line 388
2.  at Request->session() in ShareErrorsFromSession.php line 42
3.  at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 148
4.  at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
5.  at Pipeline->Illuminate\Routing\{closure}(object(Request)) in StartSession.php line 64
6.  at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 148
7.  at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
8.  at Pipeline->Illuminate\Routing\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
9.  at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 148
10. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
11. at Pipeline->Illuminate\Routing\{closure}(object(Request)) in EncryptCookies.php line 59
12. at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 148
13. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
14. at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 102
15. at Pipeline->then(object(Closure)) in Router.php line 561
16. at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 520
17. at Router->dispatchToRoute(object(Request)) in Router.php line 498
18. at Router->dispatch(object(Request)) in Kernel.php line 174
19. at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) in Pipeline.php line 30
20. at Pipeline->Illuminate\Routing\{closure}(object(Request)) in TransformsRequest.php line 30
21. at TransformsRequest->handle(object(Request), object(Closure)) in Pipeline.php line 148
22. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
23. at Pipeline->Illuminate\Routing\{closure}(object(Request)) in TransformsRequest.php line 30
24. at TransformsRequest->handle(object(Request), object(Closure)) in Pipeline.php line 148
25. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
26. at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ValidatePostSize.php line 27
27. at ValidatePostSize->handle(object(Request), object(Closure)) in Pipeline.php line 148
28. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
29. at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 46
30. at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 148
31. at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
32. at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 102
33. at Pipeline->then(object(Closure)) in Kernel.php line 149
34. at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 116
35. at Kernel->handle(object(Request)) in index.php line 53

person Pete    schedule 02.05.2017    source источник
comment
Я думаю, вам следует раскомментировать строки промежуточного программного обеспечения сеанса в группе веб-промежуточного программного обеспечения. Эта ошибка может возникать из-за отсутствия функций сеанса, которые требуются промежуточному программному обеспечению ShareErrorsFromSession.   -  person Jan Willem    schedule 03.05.2017
comment
Хорошая мысль - пробовал, но не повезло   -  person Pete    schedule 03.05.2017


Ответы (3)


Идём от ошибки:

Хранилище сеансов не задано по запросу.

Это означает, что объект Request не имеет связанного с ним объекта Session. Однако ShareErrorsFromSession будет использовать сеанс для представления вашего сообщения об ошибке в представлении. Из этого мы можем сказать, что у вас есть некоторые проблемы здесь:

// \App\Http\Middleware\StartSession::class,

Программное обеспечение промежуточного слоя StartSession отвечает за настройку объекта сеанса в вашем запросе. Если вы отключите его, вы не сможете ShareErrorsFromSession.

Но просто раскомментировать это может быть недостаточно, если у вас нет действительного SESSION_DRIVER, который сообщит StartSession промежуточному программному обеспечению, какой драйвер сеанса он должен использовать. Итак, наконец, проверьте файл .env и убедитесь, что вы используете действующий драйвер сеанса.

Все это дополняет ответ Матье: вашему веб-серверу требуется разрешение на запись в папку storage/. Самый простой способ добиться этого — использовать chmod 777. Если вы понимаете, как вызываются скрипты, и знаете, какой пользователь управляет Nginx, вы можете подготовить свои файлы к тому, чтобы они принадлежали этому пользователю, и установить для него значение 755.

person Marco Aurélio Deleu    schedule 04.05.2017
comment
Вы очень помогли с этим - .env SESSION_DRIVER каким-то образом был установлен на null ... изменение этого обратно все исправило - person Pete; 04.05.2017
comment
Все возможные причины включены! +1 - person Miron; 03.06.2017

Вы проверили права доступа к папке storage?

если не попробовать:

chmod -R 777 storage/
person Mathieu Ferre    schedule 03.05.2017
comment
Было 775... сменилось на 777, перезапустил nginx, но та же ошибка - person Pete; 03.05.2017

Просто еще одна причина:

Если вы используете Laravel Sanctum (или как-то добавляете EnsureFrontendRequestsAreStateful) и сеанс не при запуске вам может потребоваться добавить URL-адрес вашего производства и разработки проекта в переменную среды SANCTUM_STATEFUL_DOMAINS.

Это происходит, если вы, например, используете Vagrant с указанным хостом, а не с хостами по умолчанию, такими как 127.0.0.1.

person Amirreza Nasiri    schedule 10.04.2020