2016-05-28 4 views
0

私のアプリケーションには3つの役割があります。私は2つの役割が同じページにアクセスできるという条件があります。そのために私は以下のコードを書いています。私はミドルウェアで定義したり条件付けたりすることができるようにコードがありますか?

以下のコードでは、サブプラン1とサブプラン2はロールです。

Route::group(['middleware' => ['web', 'auth', 'SubPlan1', 'SubPlan2']], function() { 
    Route::get('/Parent-1-Info', '\[email protected]')); 
}); 

サブプラン1でページにアクセスしようとすると、私は同じグループの両方のミドルウェアを言いましたので、404エラーが表示されます。

ミドルウェアで定義したり条件付けることができるようにコードが作成されていますか?役割ベースの認証のために、私は、このミドルウェアを使用してい

+0

パラメータを取るミドルウェアを作成し、パラメータとして 'roles'を渡すことができます。 – lagbox

答えて

1

namespace App\Http\Middleware; 

use Auth; 
use Closure; 
use App\Role; 
use Illuminate\Support\Collection; 

class RoleMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next, $roles = null, $guard = null) 
    { 
     $roles = Role::whereIn('slug', explode('|', $roles))->get(); 

     if (! Auth::guard($guard)->user()->hasRole($roles)) { 
      return abort(403, 'Forbidden'); 
     } 

     return $next($request); 
    } 
} 

はその後、ユーザーが持っているかどうかを確認する方法を持っていることを確認したユーザモデルにKernel.php

'role' => \App\Http\Middleware\RoleMiddleware::class, 

にミドルウェアを登録しますロールセット、例:

public function hasRole($role) 
{ 
    if (is_int($role)) { 
     return $this->roles->contains('id', $role); 
    } 

    if (is_string($role)) { 
     return $this->roles->contains('slug', $role); 
    } 

    if ($role instanceof Model) { 
     return $this->roles->contains('id', $role->id); 
    } 

    return !! $role->intersect($this->roles)->count(); 
} 

そして、このようなミドルウェアを使用することができますS:

Route::group(['middleware' => ['auth', 'role:admin|staff'], ...); 

あなたは|で区切って自分の役割名とadmin|staffを置き換えることができます。カスタムguardを追加する場合は、それを2番目のパラメータとして渡すことができます。role:admin|staff,mycustomguard

関連する問題