Невозможно сгруппировать два промежуточных ПО

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

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

Admin middleware

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');
        }
}

Districtlogin 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');
    }
}

One additional middleware to check if the user is approved

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 на основе промежуточного программного обеспечения.

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

ваши два промежуточных программного обеспечения несовместимы, чтобы иметь их вместе. Каждый проверяет условие, НЕ ВЫПОЛНЯЕМОЕ другим, поэтому НЕТ ОБЩЕГО ЗНАЧЕНИЯ, чтобы сгруппировать их вместе. Либо измените свое промежуточное ПО, чтобы оно имело какую-то общую основу (например, Auth::check() && Auth::user()->isAdmin > 1), либо используйте разные маршруты для каждого промежуточного ПО.

Nikos M. 30.03.2019 17:07

Спасибо за быстрый ответ @NikosM. Я создам новые маршруты для другого промежуточного программного обеспечения :)

mightyteja 30.03.2019 17:09

@НикосМ. Не могли бы вы сообщить мне: «Либо измените промежуточное программное обеспечение, чтобы оно имело какую-то общую основу (например, Auth::check() && Auth::user()->isAdmin > 1)».

mightyteja 30.03.2019 17:31

извините, я имел в виду Auth::check() && Auth::user()->isAdmin >= 1 это включает в себя оба случая, когда isAdmin = 1 или isAdmin = 2, поэтому есть точки соприкосновения, и промежуточные программы могут быть сгруппированы вместе, на самом деле достаточно одного промежуточного программного обеспечения с вышеуказанным условием, и ТОГДА в вашем коде проверьте, является ли isAdmin 1 или 2. Но лучше иметь разные маршруты, если вам нужны очень разные функции для каждого типа пользователя.

Nikos M. 30.03.2019 17:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Два промежуточных ПО — несовместимы друг с другом, у них есть нет точек соприкосновения. Там, где один преуспевает, другой терпит неудачу и перенаправляет на страницу входа.

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

Вторая часть заключается в том, что 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');

});

Твой выбор :)

Другие вопросы по теме