Middleware Laravel com múltiplos papéis

Eu tenho enfrentado alguns problemas com o middleware da Laravel. Deixe-me dizer-lhe a ideia básica do que estou tentando realizar:

Usuários registrados no site terão uma das quatro funções:

  1. Estudante (padrão): pode acessar exibições de ” índice ” e ” mostrar
  2. Aprovador: pode acessar o anterior, mais ‘ visão geral ‘, ‘ atualização
  3. Editor: pode acessar o anterior, mais ‘ criar ‘, ‘ editar ‘ e ‘ armazenar
  4. Admin: pode acessar tudo

fyi: “visão geral” é uma espécie de visualização de índice, mas apenas para o papel do aprovador e superior

O que vocês sugerem é a melhor maneira de fazer isso? Isso é o que fiz até agora, mas isso não parece funcionar:


Kernel.php

protected $middlewareGroups = [ ... 'approver+' => [ \App\Http\Middleware\Approver::class, \App\Http\Middleware\Editor::class, \App\Http\Middleware\Admin::class, ], ]; protected $routeMiddleware = [ ... 'student' => \App\Http\Middleware\Student::class, 'approver' => \App\Http\Middleware\Approver::class, 'editor' => \App\Http\Middleware\Editor::class, 'admin' => \App\Http\Middleware\Admin::class, ]; 

Http \ Middleware \ Admin.php

 public function handle($request, Closure $next) { if (Auth::check()) { if(Auth::user()->isAdmin()) { return $next($request); } } return redirect('login'); } 

O modelo de usuário “Eloquent”:

 public function isAdmin() { if($this->role_id === 4) { return true; } else { return false; } } 

Eu fiz exatamente o mesmo nos arquivos de middleware do Aprovador e Editor, e nas funções isApprover e isEditor no modelo do Usuário, apenas editado o valor verificado na instrução if para 2 e 3, respectivamente.

Finalmente, aqui está o que fiz nas minhas rotas \ arquivo web:

 Route::get('scholen', 'SchoolsController@index'); Route::get('admin/scholen/overzicht', 'SchoolsController@overview')->middleware('approver+'); Route::get('admin/scholen/maken', 'SchoolsController@create')->middleware('approver+'); Route::post('scholen', 'SchoolsController@store')->middleware('approver+'); Route::get('scholen/{id}', 'SchoolsController@show'); Route::get('admin/scholen/{id}/bewerken', 'SchoolsController@edit')->middleware('admin'); Route::patch('admin/scholen/{id}', 'SchoolsController@update')->middleware('admin'); Route::delete('admin/scholen/{id}', 'SchoolsController@destroy')->middleware('admin'); 

Ainda não está exatamente no ponto, mas fiquei preso desde que eu logro como usuário com direitos de Aprovação e tente acessar a visão geral das escolas, redireciona-me de volta para a página inicial.

Em geral, parece que estou trabalhando de forma muito caótica e não corretamente, alguém poderia me dar conselhos sobre como fazê-lo de forma mais eficiente?

Muito obrigado antecipadamente!

    Você deve ter um middleware separado para cada function. Vai ficar muito confuso muito rápido. Seria melhor ter uma única function que verificasse o middleware que pode verificar contra qualquer papel que lhe foi passado.

    Http \ Kernel.php

     protected $routeMiddleware = [ ... 'role' => \App\Http\Middleware\Role::class, ]; 

    Http \ Middleware \ Role.php

     public function handle($request, Closure $next, ... $roles) { if (!Auth::check()) // I included this check because you have it, but it really should be part of your 'auth' middleware, most likely added as part of a route group. return redirect('login'); $user = Auth::user(); if($user->isAdmin()) return $next($request); foreach($roles as $role) { // Check if user has the role This check will depend on how your roles are set up if($user->hasRole($role)) return $next($request); } return redirect('login'); } 

    Finalmente nas suas rotas na web

     Route::get('admin/scholen/overzicht', 'SchoolsController@overview')->middleware('role:editor,approver'); Route::get('admin/scholen/{id}/bewerken', 'SchoolsController@edit')->middleware('role:admin');