2017-06-17 102 views
2

以下描述基於Laravel開發。Laravel多用戶類型

的我希望實現的是功能的簡要說明,

有3種類型的用戶。 Superadmin,管理員和最終用戶。

只有一個Superadmin存在,他可以創建管理員和最終用戶。可以存在多個管理員,併爲給定站點定義管理員。管理員可以創建多個最終用戶。

爲了便於上述用例,我應該在Laravel中採取什麼樣的方法?

我嘗試到目前爲止做到這一點是:

我實現了多後衛,然後我被卡住了,因爲有相應的路由應該由所有類型的用戶訪問。我不能用多個警衛完成它,因爲如果我爲一個路線定義多個警衛,那麼只有在所有多個用戶類型都登錄後才能訪問該路線。

說,我有一條由Superadmin守衛的路線,管理員,只有以Superadmin登錄時,此路線纔可用。只有當Superadmin和Admin都登錄後,路線纔可用。

似乎如果我們分配多個警衛,警衛 ed。但我需要他們是編。

警衛任務:

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

回答

0

你的邏輯,一個超級管理員始終是管理員和管理員也是最終用戶。如果你以嵌套級別打開路線,你可以像這樣得到這個工作。

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

如果我以嵌套的形式對路由進行分組,superadmin路由由enduder和admin來保護。最終用戶和管理員都必須登錄才能訪問superadmin路由。我測試了它,並將其重定向到Enduser登錄頁面。 –

+0

你的管理員和superadmin應該是最終用戶,這是基於角色的訪問的定義。 – anwerj

+0

我不明白你的意思。你能指導我解釋一下你的意思嗎? –

0

我將SuperAdmin,Admin和EndUser分解爲單個執行簡單角色檢查的中間件,而不是Guard。例如,一個超級管理員中間件:

/** 
* 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_typeUser模型的屬性。 SUPERADMIN,ADMINENDUSER是三種用戶類型。它與用戶角色不同,因爲用戶可以擔任多個角色,而一旦指定爲ADMIN的用戶將永遠爲ADMIN,並且他可以擁有特殊權限。
  2. 實施授權機制,其中一個路線可以授予任
    • 到單個用戶(即只有授權的用戶可以訪問特定的路線)或
    • 給用戶角色(不是user_type用戶角色可能有多個用戶)
  3. 路由被分組到permission_set。一個user_role可以有多個permission_sets

當用戶登錄時,中間件檢查所請求的資源是否被授權爲User