2014-11-01 99 views
1

我很想知道是否有可能阻止沒有角色所有者或管理員的用戶訪問laravel應用程序中的某些控制器?在具有多種角色限制的方法之前

+0

當然有可能,但我們不會爲你做所有的工作。首先嚐試一下(我確定在互聯網上有關於此的教程),如果您遇到特定問題,請再次詢問。 – lukasgeiter 2014-11-01 21:06:43

+0

好吧,我見過像屬於lukasgeiter的例子,但如果它是多種類型的用戶。 – user3732216 2014-11-01 23:01:25

+0

我不確定我是否理解你,但我只是想向你提出一些想法;) 一種方法是爲每個角色分配一個數字,而較高者包含較低分數的許可。所以你可以檢查「權限級別」是否足夠高。 如果這不夠靈活,它會變得更加複雜... 無論你做什麼,你至少需要一個用戶表引用的角色表。可能通過數據透視表。如果你想得到更詳細的答案,可能試圖提出更具體的問題 – lukasgeiter 2014-11-01 23:11:52

回答

1

是的,你可以。您可以使用路由過濾器來完成此操作。

routes.php文件

Route::group(['prefix' => 'admin', 'before' => 'auth.admin'), function() 
    { 

    // Your routes  

    } 
]); 

和filters.php

Route::filter('auth.admin', function() 
{ 
    // logic to set $isAdmin to true or false  

    if(!$isAdmin) 
    { 
    return Redirect::to('login')->with('flash_message', 'Please Login with your admin credentials'); 
    } 
}); 
+0

但是,如果我有不止一種類型的用戶(例如管理員或所有者)可以訪問,那麼該怎麼辦。 – user3732216 2014-11-01 22:29:09

+0

@ user3732216 - 然後,您只需添加一個新的過濾器與您的特定規則集。 或者,您可以使用名爲https://cartalyst.com/manual/sentry或其付費哨兵包的軟件包。不過,我個人對他們的文檔(或缺乏)感到不滿意,這意味着你必須做一些黑客工作才能做一些不尋常的事情。 – Gravy 2014-11-02 09:24:13

1

路由過濾器已經被提出,但因爲你的過濾器應該是控制器具體你可能想嘗試controller filters

首先,讓我們來添加此控制器(S)

public function __construct() 
{ 
    $this->beforeFilter(function() 
    { 
     // check permissions 
    }); 
} 

執行一個控制器動作之前,此函數被調用。

在那裏它取決於你想要做什麼。我剛纔猜測,因爲我不知道您的具體架構,但我想你想要做這樣的事情:

$user = Auth::user(); 
$role = $user->role->identifier; 

if($role !== 'admin' && $role !== 'other-role-that-has-access'){ 
    App::abort(401); // Throw an unauthorized error 
} 

而不是拋出一個錯誤,你可以也使重定向,渲染視圖或根本無論你想要什麼。只要做一些事情就會停止進一步的執行,所以你的控制器動作不會被調用

編輯

而不是使用閉合功能,你可以使用預定義的過濾器(從routes.php文件或filters.php)

$this->beforeFilter('filter-name', array('only' => array('fooAction', 'barAction'))); 

欲瞭解更多信息,請查看documentation

+0

這是偉大的,但我有很多這些。那麼有沒有一種方法可以在路線文件中執行此操作,或者適用於過濾器文件。 – user3732216 2014-11-02 00:20:42

+0

我個人不使用控制器過濾器。我更喜歡把這個邏輯放在路由文件中。 (分離關注點並保持代碼清潔)只需將控制器嵌入帶Route過濾器的'Route :: group'中即可。 – Gravy 2014-11-02 09:29:20

+0

@Gravy這是真的。在我看來,它有點味道和要求。例如。將每個控制器路由封裝在一個組中,因爲它具有不同的角色不會吸引我。 (對我來說一個組應該是多條路線)。 我知道你可以指定沒有組的過濾器,但在某些情況下不像使用控制器過濾器那樣詳細(對於特定操作) – lukasgeiter 2014-11-02 11:57:20

相關問題