2017-05-10 10 views
0

私はLaravelのミドルウェアに関するいくつかの問題に取り組んできました。複数の役割を持つLaravelミドルウェア

  1. 学生(デフォルト):インデックス 'にアクセスすることができ、サイト上の

    登録ユーザーは、4つの役割の一つがあります: 私はあなたに私が達成しようとしているものの基本的な考え方を教えてみましょう'と' ショーの見解

  2. 承認者:以前にアクセスし、プラスすることができます ':CA「、 '更新'
  3. エディタを概要 n個前のアクセスに加え、 'を作成'、 '編集' と ''
  4. 管理者は:すべて

アクセスすることができます参考: '概要' は、インデックスビューの一種です、承認者の役割以上の場合のみ

これを行う最善の方法は何ですか?これは私がこれまで行ってきたものですが、動作していないよう:


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 \ミドルウェア\ Admin.phpは

public function handle($request, Closure $next) 
{ 
    if (Auth::check()) 
    { 

     if(Auth::user()->isAdmin()) 
     { 
      return $next($request); 
     } 
    } 

    return redirect('login'); 
} 

「ユーザー」Eloquentモデル:

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

私はApproverとEditorのミドルウェアファイルで全く同じことを行い、UserモデルのisApprover関数とisEditor関数では、if文のチェック値をそれぞれ2と3に編集しました。

最後に、ここではウェブファイルは\私は私のルートで行われてきたものだ:

Route::get('scholen', '[email protected]'); 
Route::get('admin/scholen/overzicht', '[email protected]')->middleware('approver+'); 
Route::get('admin/scholen/maken', '[email protected]')->middleware('approver+'); 
Route::post('scholen', '[email protected]')->middleware('approver+'); 
Route::get('scholen/{id}', '[email protected]'); 
Route::get('admin/scholen/{id}/bewerken', '[email protected]')->middleware('admin'); 
Route::patch('admin/scholen/{id}', '[email protected]')->middleware('admin'); 
Route::delete('admin/scholen/{id}', '[email protected]')->middleware('admin'); 

それはまだ正確にポイントですべてではありませんが、私は、私は承認者を持つユーザーとしてログインしたとき以来、捕まってしまいました権利を取得し、学校の概要にアクセスしようとすると、私はホームページにリダイレクトされます。

一般に、私はあまりにも混乱していて、まったく正しくないように感じています。もっと効率的に行う方法についてアドバイスをいただけますか?

ありがとうございます!

答えて

4

各役割ごとに別々のミドルウェアを用意するべきではありません。それは非常に厄介な非常に高速になります。それは、それに渡されるすべての役割に対してチェックできるミドルウェアをチェックする単一の役割を持つ方が良いでしょう。

Http \ Kernel。PHP

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

のHttp \ミドルウェア\ 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'); 
} 
ウェブルートで最後に

Route::get('admin/scholen/overzicht', '[email protected]')->middleware('role:editor,approver'); 
Route::get('admin/scholen/{id}/bewerken', '[email protected]')->middleware('role:admin'); 
+0

私は、私はそれ正常​​に動作するようですあまりにも複雑:)作っていた考え出しどうもありがとうございました! – Jesse

関連する問題