Защита маршрутов с помощью двух промежуточных продуктов, чтобы оба пользователя могли получить к ним доступ - PullRequest
2 голосов
/ 26 сентября 2019

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

Я создалдва промежуточных продукта для эксперта и пользователя и защита маршрута с помощью этих промежуточных продуктов.

Web.php

Route::group(['middleware' => ['expert','user']], function () {
                Route::post('/showForm','UserController@showFormFilled');
        });

Пользовательское промежуточное ПО

public function handle($request, Closure $next)
    {
        //////////////////// check if user is logged in  ///////////////////
        if(Auth::check())
        {
            ////////////////// check user role id  //////////////////////////
            if(auth()->user()->role_id == 3)
            {
                return $next($request);
            }
            else if (auth()->user()->role_id==2)
            {
                return redirect('/expert');
            }
        }
        else
        {
            return redirect('/login');
        }

    }

Экспертное среднееware

public function handle($request, Closure $next)
    {
        if(Auth::check()){
            if(auth()->user()->role_id == 2)
                return $next($request);
            else if (auth()->user()->role_id==3)
                return redirect('/dashboard');
        }
        else {
            return redirect('/login');
        }
    }

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

1 Ответ

0 голосов
/ 26 сентября 2019

@ hamzahummam - нет способа достичь того, что вы ищете, используя вышеупомянутый метод отдельный-middlware-for-each-type.Каждое промежуточное программное обеспечение преждевременно перенаправляет [либо на /dashboard, либо на /expert и т. Д.] Запрос, не позволяя ему проходить через другое промежуточное программное обеспечение.Лучше всего использовать сторонний пакет, который обеспечивает более полный и детальный контроль доступа [пример: https://github.com/Zizaco/entrust]

Если это не вариант, лучшим вариантом будет внедрение единого промежуточного программного обеспечения ипередать роль в качестве параметра.См .: Параметры промежуточного программного обеспечения Laravel

Минимальный пример будет выглядеть так:

public function handle($request, Closure $next, $role)
{
    // Assuming Auth::check() passes
    $roleId = auth()->user()->role_id;

    if ($roleId == 2 && strpos($role, 'expert') !== false) {
        // Logged in user is `expert` and route allows `expert` access
        return $next($request);
    } else if ($roleId == 3 && strpos($role, 'user') !== false) {
        // Logged in user is `user` and route allows `user` access
        return $next($request);
    } // and so on...

    // Handle failures here
    if ($roleId == 2 && strpos($role, 'expert') === false) {
       // an `expert` is trying to access route that can't be accessed
       return redirect('/expert-dashboard');
    } // and so on...
}

Вы определяете маршруты как:

Route::group(['middleware' => ['new_middleware:expert,user' ]], function () {
    Route::post('/showForm','UserController@showFormFilled');
});

Надеждаэто помогает.

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