Невозможно сгруппировать два промежуточных ПО - PullRequest
1 голос
/ 30 марта 2019

Я пытаюсь реализовать 3 пользовательских типа в своем приложении, я использую Auth of Laravel по умолчанию.

Я создал 2 дополнительных промежуточных программного обеспечения для обеспечения условий для дополнительного пользователя (admin & Districtlogin) вместе с промежуточным программным обеспечением для одобрения пользователя и с использованием значения по умолчанию для пользователя laravel

Администратор промежуточного программного обеспечения

class Admin
{
   tion handle($request, Closure $next)
    {
        if( Auth::check() && Auth::user()->isAdmin == 1)
        {
            return $next($request);
        }
            Auth::logout();
            return redirect('login')->with('error','You have not admin access');
        }
}

Middlelogin Middleware

class Districtlogin
{
    public function handle($request, Closure $next)
    {
        if (Auth::check() && Auth::user()->isAdmin == 2) {
            return $next($request);
        }
        Auth::logout();
        return redirect('login')->with('error', 'You have not admin access');
    }
}

Еще одно промежуточное ПО для проверки, одобрен ли пользователь

class ApproveUser
{

    public function handle($request, Closure $next)
    {

        if( Auth::check() && Auth::user()->row_status == 1)
    {
        return $next($request);

    }
            return redirect('/userapprove');

    }

Я могу перенаправить их на основании логина

Auth / LoginController

 public function redirectPath()
    {
        if (Auth::user()->isAdmin == 1 && Auth::user()->row_status == 1) {
            return '/adminindex';
        } elseif (Auth::user()->row_status == 0) {
            return '/userapprove';
        } elseif (Auth::user()->isAdmin == 2 && Auth::user()->row_status == 1) {
            return '/districtindex';
        }
        return '/engineerdashboard';
    }

Вот мой

kernel.php

запись

'admin' => \App\Http\Middleware\Admin::class,
'districtlogin' => \App\Http\Middleware\Districtlogin::class,
'userapprove' => \App\Http\Middleware\ApproveUser::class,

Я бы хотел сгруппировать промежуточное ПО admin и Districtlogin.

Я использую CRUD, я бы хотел, чтобы Districtlogin имел доступ к нескольким контроллерам - индекс, магазин, обновление

Когда я пытаюсь сгруппировать промежуточное ПО, меня перенаправляют обратно на экран входа в систему. Ни одно из промежуточного программного обеспечения не работает

Вот что я попробовал,

1)

Route::middleware(['admin'])->group(function () {

    //Admin Dashboard
    Route::resource('adminindex', 'AdminindexController')->middleware('districtlogin');
    Route::get('adminindex/new', 'AdminindexController@admindashboard');
});

2)

Route::middleware(['admin','districtlogin'])->group(function () {

    //Admin Dashboard
    Route::resource('adminindex', 'AdminindexController');
    Route::get('adminindex/new', 'AdminindexController@admindashboard');

});

3)

 Route::middleware(['admin',''])->group(function () {

        //Admin Dashboard
        Route::resource('adminindex', 'AdminindexController');
        Route::get('adminindex/new', 'AdminindexController@admindashboard');

        Route::middleware(['districtlogin'])->group(function () {
        Route::resource('adminindex', 'AdminindexController');

           });

    });

Но когда я использую условие «ИЛИ», я могу получить доступ к страницам

Route::group(['middleware' => ['admin' OR 'districtlogin']], function () {

    //Admin Dashboard
    Route::resource('adminindex', 'AdminindexController');
    Route::get('adminindex/new', 'AdminindexController@admindashboard');
});

Контроллеры доступны обоим промежуточным программам. Но как мне ограничить функции Crud на основе промежуточного программного обеспечения.

Я совершенно не знаю, как этого добиться.

1 Ответ

1 голос
/ 31 марта 2019

Полный ответ:

Два промежуточных программного обеспечения несовместимы друг с другом , у них нет общего основания . Там, где один преуспевает, другой терпит неудачу и перенаправляет на страницу входа.

Итак, это объясняет первую часть вашего вопроса.

Вторая часть заключается в том, что Route::group(['middleware' => ['admin' OR 'districtlogin']] .. не имеет смысла в настройке промежуточного программного обеспечения. это эквивалентно Route::group(['middleware' => ['admin']] .., так как выражение 'admin' OR 'districtlogin' всегда вычисляется до первого операнда. Кроме того, это вводит в заблуждение, поскольку Laravel не поддерживает наличие промежуточного программного обеспечения для одного или другого , это бессмысленное выражение.

Решение:

Либо используйте одно промежуточное ПО , которое может поддерживать оба варианта, например:

class AdminOrDistrictlogin
{
    public function handle($request, Closure $next)
    {
        if (Auth::check() && Auth::user()->isAdmin >= 1 ) {
            return $next($request);
        }
        Auth::logout();
        return redirect('login')->with('error', 'You have not admin access');
    }
}

entry:

'adminOrdistrict' => \App\Http\Middleware\AdminOrDistrictlogin::class,
'userapprove' => \App\Http\Middleware\ApproveUser::class,

routes

Route::middleware(['adminOrdistrict'])->group(function () {

    //Admin or District Dashboard, distignuish later in your code
    Route::resource('adminindex', 'AdminindexController');
    Route::get('adminindex/new', 'AdminindexController@admindashboard');

});

А в ваших контроллерах и представлениях уточняйте, проверяя значение Auth::user()->isAdmin для различения простых администраторов или районов

или , если функциональность очень отличается между простыми администраторами и районами, создает новые и разные маршруты для admin и district и использует каждое промежуточное ПО на соответствующем маршруте группа для каждого типа пользователя.

Например:

Route::middleware(['admin'])->group(function () {

    //Admin Dashboard
    Route::resource('adminindex', 'AdminindexController');
    Route::get('adminindex/new', 'AdminindexController@admindashboard');

});

Route::middleware(['districtlogin'])->group(function () {

    //District Dashboard
    Route::resource('districtindex', 'DistrictindexController');
    Route::get('districtindex/new', 'DistrictindexController@admindashboard');

});

Выбор за вами:)

...