Laravel группа нескольких Middleware - PullRequest
0 голосов
/ 28 марта 2019

В моем приложении у меня есть три роли пользователя:

  1. пользователь
  2. редактор
  3. admin

Когда редактор входит вАдминистративный раздел, некоторые разделы скрыты (пользователи управляют, системная информация и т. д.) и, конечно, администратор может видеть все.

Итак, для этой цели я создал два промежуточных ПО: Admin и Editor.Это код.

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

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;

use Closure;

class Admin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check()) {
          if(Auth::user()->role_id == 3) {
            return $next($request);
          }
        }

        return redirect('/');

    }
}

Промежуточное программное обеспечение редактора:

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;

use Closure;

class Editor
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check()) {
          if(Auth::user()->role_id == 2) {
            return $next($request);
          }
        }

        return redirect('/');

    }
}

Вот часть ядра:

protected $routeMiddleware = [

'admin' => \App\Http\Middleware\Admin::class,
'editor' => \App\Http\Middleware\Editor::class,

];

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

Вот код только для администратора, и он работает нормально.

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

  Route::get('/admin', 'PagesController@adminIndex');
  Route::resource('/admin/pages', 'PagesController');
  Route::resource('/admin/news', 'NewsController');
  Route::resource('/admin/users', 'UsersController');
  ...
});

Я пытался объединить их с этим кодом, но он не работает (вообще не могу войти в раздел администратора):

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

  Route::get('/admin', 'PagesController@adminIndex');
  Route::resource('/admin/pages', 'PagesController');
  Route::resource('/admin/news', 'NewsController');
  Route::resource('/admin/users', 'UsersController');
  ...
});

Как я могу решить эту проблему?

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

Ответы [ 3 ]

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

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

Например:

protected $routeMiddleware = [
   'checkRole' => \App\Http\Middleware\CheckRole::class,
];

Промежуточное программное обеспечение:

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;

use Closure;

class CheckRole
{
    public function handle($request, Closure $next, ...$roles)
    {
        $roleIds = ['user' => 1, 'editor' => 2, 'admin' => 3];
        $allowedRoleIds = [];
        foreach ($roles as $role)
        {
           if(isset($roleIds[$role]))
           {
               $allowedRoleIds[] = $roleIds[$role];
           }
        }
        $allowedRoleIds = array_unique($allowedRoleIds); 

        if(Auth::check()) {
          if(in_array(Auth::user()->role_id, $allowedRoleIds)) {
            return $next($request);
          }
        }

        return redirect('/');

    }
}

Маршруты:

Route::middleware(['checkRole:admin,editor'])->group(function(){
  //Your routes  
});
1 голос
/ 28 марта 2019

Должно быть как ниже.

Route::middleware(['auth'])->group(function(){
//common routes will goes here

   Route::middleware(['admin'])->group(function(){//admin routes will goes here
      Route::get('/admin', 'PagesController@adminIndex');
      Route::resource('/admin/pages', 'PagesController');
      Route::resource('/admin/news', 'NewsController');
      Route::resource('/admin/users', 'UsersController');
   });

    Route::middleware(['editor'])->group(function(){
       //editor routes goes here.
    });


});
0 голосов
/ 28 марта 2019

Проблема в том, что ваше связующее ПО (['admin', 'editor']) проверяет обе роли, т.е. admin, editor для пользователя, и у вас есть только одна роль дляпользователь.Вот почему он не работает

Существуют отличные пакеты для управления ролями пользователей, которые просты в использовании.Я предлагаю вам использовать Spatie Laravel Permission , если вы хотите обучающие программы по нему, посмотрите Bitfumes Video

...