Laravel 5.5 Вложенная группа маршрутов с несколькими пользовательскими типами

У меня два типа пользователей: эксплуатация и обслуживание. Все маршруты, к которым относится тип пользователя «Операции», могут быть доступны для типа пользователя «Обслуживание», но не все маршруты, которые имеет тип «Операции», не могут быть доступны для типа «Операции».

Вот мой существующий код.

Route::group(['middleware'=>'maintenance'], function(){
    //routes here

    Route::group(['middleware'=>'operations'], function(){
         //routes here

    });
});

kernel.php

 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,
    'revalidate' => \App\Http\Middleware\RevalidateBackHistory::class,
    'dev' => \App\Http\Middleware\isDev::class,
    'operations' => \App\Http\Middleware\operations::class,
    'maintenance' => \App\Http\Middleware\maintenance::class,
];

промежуточное ПО / operations.php

public function handle($request, Closure $next)
{
    $a = UserAccess::where(['employee_id'=>\Auth::user()->id, 'user_type_id'=>1])->first();
    if($a){
        return $next($request);
    }

    return redirect('/');
}

Но это не работает. Служба технического обслуживания может получить доступ ко всем своим маршрутам, но не имеет доступа к операциям, а служба эксплуатации вообще не имеет доступа ни к одному маршруту.

ПРИМЕЧАНИЕ. Обе группы входят в группу промежуточного программного обеспечения для проверки подлинности.


person Ralph Vitto    schedule 12.02.2018    source источник
comment
Покажите нам свой app/Http/Kernel.php код, а также ваш operations код промежуточного программного обеспечения   -  person Nikola Gavric    schedule 12.02.2018
comment
Код @NikolaGavric отредактирован.   -  person Ralph Vitto    schedule 12.02.2018


Ответы (2)


Нашел обходной путь для этого. Я создал еще одно промежуточное программное обеспечение, которое обслуживает как операции, так и техническое обслуживание, передав этому промежуточному программному обеспечению два параметра, а именно 1 = Операции и 2 = Обслуживание, и проверил доступ к промежуточному программному обеспечению. Вот код:

Route::group(['middleware'=>'access:2,2'], function(){
    //Routes that can be accessed by Maintenance user type
});

Route::group(['middleware'=>['access:1,2']], function(){
    //Routes that can be accesed by Operations and Maintenance user type.
});

Вот промежуточное ПО:

public function handle($request, Closure $next, $ops, $main)
{
    $a = UserAccess::where('employee_id',\Auth::user()->id)->whereIn('user_type_id', [$ops, $main])->first();
    if($a){
        return $next($request);
    }

    return redirect('/');
}

РЕДАКТИРОВАТЬ:

Оптимизированный код для удаления избыточности параметров.

Web.php:

Route::group(['middleware'=>'access:2'], function(){
    //Routes that can be accessed by Maintenance user type
});

Route::group(['middleware'=>['access:1,2']], function(){
    //Routes that can be accesed by Operations and Maintenance user type.
});

access.php

public function handle($request, Closure $next, $ops, $main = 0)
{
    $a = UserAccess::where('employee_id',\Auth::user()->id)->whereIn('user_type_id', [$ops, $main])->first();
    if($a){
        return $next($request);
    }

    return redirect('/');
}
person Ralph Vitto    schedule 12.02.2018

Я думаю, вы пропустили дополнительный массив внутри вашего where запроса, попробуйте изменить код внутри вашего operations промежуточного программного обеспечения следующим образом:

$a = UserAccess::where([
         ['employee_id', \Auth::user()->id],
         ['user_type_id', 1]
     ])->first();

РЕДАКТИРОВАТЬ:

Затем попробуйте переместить оба ваших middlewares в $middlewareGroups ниже web промежуточного программного обеспечения, например:

'web' => [
    ...
],
'operations' => \App\Http\Middleware\operations::class,
'maintenance' => \App\Http\Middleware\maintenance::class,

ИЗМЕНИТЬ 2:

Измените код переменной $a на этот

$a = UserAccess::where([
         ['employee_id', Auth::user()->id], //Hence there is no \ before Auth
         ['user_type_id', 1]
     ])->first();

Затем в верхней части того же файла включите следующее use:

use Illuminate\Support\Facades\Auth;

ИЗМЕНИТЬ 3:

Вы можете добавить дополнительные параметры в request, которые затем будут отправлены вперед, например:

Middlewares / operations.php

function handle($request, Closure $next) {
    ...
    $request->attributes->add(['passedOperations' => true]);
    return next($next);
}

Middlewares / maintenance.php

function handle($request, Closure $next) {
    ...
    if($request->get('passedOperations')) {
        return next($next);
    } else {
        //didn't pass operations
    }
}
person Nikola Gavric    schedule 12.02.2018
comment
Я не думаю, что это проблема с моим запросом, потому что если я выделю группу операций отдельно от обслуживания, она будет работать плавно. Это перестает работать, только когда я помещаю группу в другую группу. - person Ralph Vitto; 12.02.2018
comment
Хм, тогда вы можете попробовать использовать эти промежуточные программы в качестве group промежуточных программ, а не в качестве отдельных промежуточных программ, проверьте правку - person Nikola Gavric; 12.02.2018
comment
Такой же результат? Выдает ли какие-то ошибки, можете ли вы объяснить поведение, что именно происходит? - person Nikola Gavric; 12.02.2018
comment
Невозможно получить маршруты доступа к группе промежуточного программного обеспечения операций. Но я могу получить доступ ко всем маршрутам по промежуточному программному обеспечению для обслуживания - person Ralph Vitto; 12.02.2018
comment
Что на самом деле означает нет доступа? Сервер дает вам 401, 403 или вы получаете ошибку, или вы получаете пустую страницу, или он вас куда-то перенаправляет? - person Nikola Gavric; 12.02.2018
comment
Он перенаправляет меня на '/', что означает, что условие на моем middlware / operations.php не выполнено. - person Ralph Vitto; 12.02.2018
comment
Попробуйте сбросить свой $a внутрь своего operations промежуточного программного обеспечения и расскажите нам, что вы получите - person Nikola Gavric; 12.02.2018
comment
Дамп возвращает ноль - person Ralph Vitto; 12.02.2018
comment
Хорошо, теперь измените код для $a на код, который я опубликовал в своем ответе, и скажите мне, что дает дамп? - person Nikola Gavric; 12.02.2018
comment
По-прежнему дает ноль - person Ralph Vitto; 12.02.2018
comment
Проверьте мою правку номер 2, следите за комментарием внутри кода - person Nikola Gavric; 12.02.2018
comment
Тот же результат, по-прежнему возвращается ноль. - person Ralph Vitto; 12.02.2018
comment
Затем вам нужно убедиться, что данные, которые вы ищете, действительно существуют в вашей базе данных, можете ли вы это подтвердить? Просто сбросьте оба Auth::user()->id, а затем проверьте свою базу данных UserAccess - person Nikola Gavric; 12.02.2018
comment
Это не сработает, поскольку я вошел в систему с типом пользователя обслуживания, чего я ожидал, поскольку группа операций находится внутри группы обслуживания, тип пользователя обслуживания будет иметь доступ к группе операций. - person Ralph Vitto; 12.02.2018
comment
В промежуточном программном обеспечении вы определяете, кто имеет доступ, поэтому, например, если вы говорите, что и maintenance, и operations пользователи имеют доступ, тогда вы передадите запрос и фактически попадете в свой endpoints внутри operations промежуточного программного обеспечения. - person Nikola Gavric; 12.02.2018
comment
Я попытался добавить промежуточное ПО в виде массива, такого как Route::group(['middleware'=>['operations', 'maintenance']], function(){, но моя проблема в том, что промежуточное ПО операций возвращает истину, но обслуживание возвращает ложь, поэтому он все еще не входит. Есть ли способ сообщить laravel, что если одно промежуточное ПО возвращает истину, примите доступ. - person Ralph Vitto; 12.02.2018
comment
Нашел решение моей проблемы, опубликую как ответ. - person Ralph Vitto; 12.02.2018