Laravel 5.5 требует авторизации в постановке

У меня есть проект с несколькими пакетами, у которых есть маршруты. У меня есть тестовая/демонстрационная среда, которая должна быть общедоступной.

Есть ли способ потребовать промежуточное программное обеспечение аутентификации (или что-то подобное) для всех маршрутов, не помещая его на все отдельные маршруты и группы маршрутов? (Думая что-то в бутстрапе??)


person Josh Bruce    schedule 12.09.2017    source источник


Ответы (1)


Если вы хотите, чтобы промежуточное ПО запускалось во время каждого HTTP-запроса к вашему приложению, просто укажите класс промежуточного ПО в свойстве $middleware вашего класса app/Http/Kernel.php.

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,
    \App\Http\Middleware\TrustProxies::class,
    YOUR MIDDLEWARE::class,
];

Если у вас нет доступа или вы не хотите изменять контроллеры пакетов, вы можете создать промежуточное ПО (рекомендуется наследовать от AuthenticateSession. Например:

<?php

namespace App\Http\Middleware;

use Illuminate\Session\Middleware\AuthenticateSession;

use Auth;
use Closure;

class AuthenticateIfEnvironment extends AuthenticateSession
{
    public function handle($request, Closure $next)
    {
        if (env('APP_ENV') == 'XXXXXXXX' && !Auth::user() && !$request->is('login')) {
            return redirect('/login');
        }
        return parent::handle($request, $next);
    }
}

Тогда Kernal.php выглядит так:

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,
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\AuthenticateIfEnvironment::class,
];
person Zenobia Panvelwalla    schedule 12.09.2017
comment
Столкнулся с проблемой. Добавлено промежуточное ПО для аутентификации. Не могу добраться до маршрута /login, потому что это маршрут. Ответ, как написано, не говорит, сделайте свой собственный маршрут (хотя это подразумевается). Просто хочу убедиться, что мы ясны для будущих читателей. - person Josh Bruce; 13.09.2017
comment
Вы можете добавить следующую строку в свой контроллер, который обрабатывает вход и выход из системы (может быть AuthController): $this->middleware('auth', ['except' => ['getActivate', 'anotherMethod']]); внутри конструктора. - person Zenobia Panvelwalla; 13.09.2017
comment
Ага. Я не хочу связываться с контроллерами пакетов. По сути, эти пакеты представляют собой полный спектр услуг; поэтому я думаю, что мне придется (захотеть) делать все, что я могу, внутри основного пакета приложений. См. правки, ожидающие рецензирования. - person Josh Bruce; 13.09.2017