Добавить несколько промежуточных программ в Laravel Project - PullRequest
2 голосов
/ 11 марта 2019

Я новичок в laravel. Я создал промежуточное ПО для каждой роли, но когда я добавляю его в свой маршрут, оно не будет работать.

Если я добавлю одно промежуточное ПО в свой маршрут, оно будет работать нормально, но когдаЯ добавляю второй и третий. Он не будет работать.

Он не показывает маршрут к авторизованному user, он перенаправляет его на дом,

Моя модель пользователя

public function IsAdmin()
{
    if($this->role_id =='1')
    {
        return true;
    }
    else
    {
        return false;
    }
}

public function IsManager()
{
    if($this->role_id =='2')
    {
        return true;
    }
    else
    {
        return false;
    }
}

public function IsUser()
{
    if($this->role_id =='3')
    {
        return true;
    }
    else
    {
        return false;
    }
}

Мой Kernal

'IsAdmin' => \App\Http\Middleware\IsAdmin::class,
'IsManager' => \App\Http\Middleware\IsManager::class,
'IsUser' => \App\Http\Middleware\IsUser::class,

Мое промежуточное ПО IsAdmin

public function handle($request, Closure $next)
{
    $user =Auth::User();
    if(!$user->IsAdmin())
    {
        return redirect('stock');
    }
    return $next($request);
}

Мой IsManager

public function handle($request, Closure $next)
{
    $user =Auth::User();
    if(!$user->IsManager())
    {
        return redirect('stock');
    }
    return $next($request);
}

и IsUser

public function handle($request, Closure $next)
{
    $user =Auth::User();
    if(!$user->IsUser())
    {
        return redirect('stock');
    }
    return $next($request);
}

и, наконец,Маршрут

Route::get('approv',['middleware'=>['IsManager','IsAdmin'],function(){
    return view('approv');
}]);

1 Ответ

2 голосов
/ 11 марта 2019

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

Вы можете обойти это (своего рода), сделав другой вид промежуточного программного обеспечения:

Ядро:

'roles' => \App\Http\Middleware\Roles::class,

И промежуточное ПО ролей:

class Roles {

    private function checkRole($role) {
          switch ($role) {
              case 'user': return \Auth::user()->IsUser();
              case 'manager': return \Auth::user()->IsManager();
              case 'admin': return \Auth::user()->IsAdmin();
          }
          return false;
    }

    public function handle($request, Closure $next, ...$roles) 
    {
         foreach ($roles as $role) {
             if ($this->checkRole($role)) {
                 //At least one role passes
                 return $next($request);
             }
         } 
         //All checks failed so user does not have any of the required roles
         return redirect('stock');  
    }
}

Затем, чтобы использовать это, вы просто делаете:

Route::get('approv',['middleware'=>['roles:manager,admin'],function(){
   return view('approv');
}]);

Это работает, потому что параметры поддержки промежуточного программного обеспечения Laravel. Вы можете передавать параметры в виде списка строк через запятую, в котором вы объявляете промежуточное ПО. В этом случае это было сделано как roles:manager,admin

Laravel отправит эти параметры в качестве дополнительных параметров в методе handle. К ним можно получить доступ, используя синтаксис PHP для переменных аргументов. В данном конкретном случае это с помощью оператора распространения массива. Это задокументировано в качестве примера в разделе аргументы функции руководства по PHP.

Обратите внимание, что это на самом деле эквивалентно высказыванию:

  public function handle($request, Closure $next, $role1=null, $role2=null, $role3=null)

, но использовать оператор распространения гораздо удобнее, поскольку ...$roles будет массивом, который содержит только те роли, которые были переданы в промежуточном программном обеспечении.

...