2017-06-17 15 views
2

以下の説明は、Laravelの開発に基づいています。私は達成するために期待しています複数のユーザータイプのLaravel

機能の簡単な説明は、ユーザーの3種類があり、

です。スーパー管理者、管理者、およびエンドユーザー

スーパー管理者は1人だけ存在し、管理者とエンドユーザの両方を作成できます。複数のAdminsが存在する可能性があり、特定のサイトに対して管理者が定義されています。管理者は複数のエンドユーザを作成できます。

上記のユースケースを容易にするため、Laravelではどのようなアプローチをとるべきですか?これまでのところ、これを達成するために

私の試みは、次のとおりです。

私は、複数のガードを実装し、ユーザーのすべてのタイプによってアクセス可能である必要があり、いくつかのルートがあるので、私は立ち往生しました。複数のガードを定義した場合、そのルートは複数のユーザタイプがすべてログインしている場合にのみアクセスできます。

私はSuperadminによってルートが保護されていますこのルートはスーパー管理者としてログインしている場合にのみ使用できます。ルートは、SuperadminとAdminの両方がログインしている場合にのみ利用できます。

複数のガードを割り当てた場合、ガードはです。しかし、私はそれらをまたはにする必要があります。

ガードの割り当て:あなたのロジックで

Route::group(['middleware' => ['auth:superadmin', 'auth:admin']], function() {... 

答えて

0

、Superadminは常にadminで、管理者もエンドユーザーです。ネストされたレベルでルートを開くことから始めれば、このような仕事を得ることができます。

Route::group(['middleware' => ['auth:enduser']], function(){ 
    // All the routes available for Enduser 


    // For Admin 
    Route::group(['middleware' => ['auth:admin']], function(){ 
     // Give admin routes here 


     //Create group for SuperAdmin 
     Route::group(['middleware'=>['auth:superadmin']], function(){ 
       // Super admin routes 
     }); 
    }); 
}); 

このようにして、Superadminにはすべてのアクセスが可能です。

+0

ネストされたフォームでルートをグループ化すると、スーパー管理者ルートは、enduderとadminの両方によって保護されます。スーパー管理者のルートにアクセスするには、enduserとadminの両方にログインする必要があります。私はテストして、エンドユーザーのログインページにリダイレクトします。 –

+0

あなたの管理者とスーパー管理者はエンドユーザでなければなりません。これはロールベースアクセスの定義です。 – anwerj

+0

私はあなたが意味するものを得ることができません。あなたは何を意味するのかを説明するいくつかのリソースに私を案内してくれますか? –

0

ガードの代わりに、私はSuperAdmin、Admin、EndUserを単純な役割チェックを実行する個々のミドルウェアに分けます。たとえば、スーパー・ユーザミドルウェア:

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

    abort(404); 
} 

その後、定期的な管理

/** 
* Handle an incoming request. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Closure $next 
* @return mixed 
*/ 
public function handle($request, Closure $next) 
{ 
    if (Auth::user()->isSuperAdmin || Auth::user()->isAdmin) { 
     return $next($request); 
    } 

    abort(404); 
} 

そして最後に認証されたユーザーのための簡単なチェック、つまりエンドユーザーすると

/** 
* Handle an incoming request. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Closure $next 
* @return mixed 
*/ 
public function handle($request, Closure $next) 
{ 
    if (Auth::check()) { 
     return $next($request); 
    } 

    abort(404); 
} 

あなたは真ん中をするために適用することができます必要に応じてグループを作成します。

Route::group(['middleware' => ['superadmin']], function() {... 

Route::group(['middleware' => ['admin']], function() {... 

Route::group(['middleware' => ['enduser']], function() {... 
+0

私はこれを試して、結果(Y) –

+0

@ LakmalPremaratne、上記の解決方法は動作します。 –

+0

@shankarmsr、私はそれを認証を使用して完了することができました。特定のリソースが特定のユーザー(またはユーザーのタイプ)に対して許可されているかどうかをチェックするミドルウェアを作成しました。 –

1

私はそれを解決することができました。複数の警備員はいません。 @anwerjが指摘したように、すべてのユーザーがタイプENDUSER

  1. Userモデルに属性としてuser_typeを追加されます。 SUPERADMIN,ADMINおよびENDUSERは、3つのユーザータイプです。ユーザーは複数のロールを取ることができるので、ユーザーロールとは異なります。一方、ADMINと指定されたユーザーは、永遠にADMINになり、特別な権限を持つことができます。
  2. ルートは、ユーザーロールに単一のユーザー(つまりのみ許可されたユーザが、特定のルートにアクセスすることができます)、または
    • のいずれかを付与することができます実装の認証メカニズム(ないuser_typeユーザ役割は複数のユーザを持つ可能性があります)
  3. ルートはpermission_setにグループ化されています。 user_roleは、要求されたリソースがUserのために付与されているかどうかpermission_sets

ユーザがログインする、複数のミドルウェアチェックを持つことができます。

関連する問題