2013-12-18 45 views
1

我在我的項目使用CakePHP和我正在尋找一種合適的方式來檢查我的意見高級用戶權限。CakePHP的:檢查授權的意見

我在其內容取決於你的權利多個頁面(您可以查看一些塊或沒有,編輯一些相關信息或沒有,等...)

我搜索,我發現的唯一辦法就是實施授權助手,但我認爲最好的辦法,以那就是實現我的「UserController的」方法(如canPerformAction($行動,$控制器=「default_controller」)),是我錯了嗎?如果我是對的,如何正確調用這些方法?

謝謝。

編輯:更多精度

比如我有一個動作「editEventProducts」,用戶只能執行,如果他活動的所有者,如果事件狀態是< = 2

我檢查在我的控制器中「isAuthorized」功能,就像一個魅力。

但我有一個網頁叫做「eventDetails」,形式可以perfom幾個動作,如這個,我想表明的編輯按鈕,只要你能做到這一點。

如果其實我需要的是,你可以調用每個動作的「isAuthorized」功能的輸出,但我可以正確地從一個視圖得到它?

解決方案

我實現了一個授權助手誰做一些檢查,如這一個,這是最後一個白名單檢查,根據我的事件的狀態,希望這將有助於,代碼:

App::uses('AppHelper', 'View/Helper'); 

class AuthHelper extends AppHelper { 

var $helpers = array('Session'); 

private $_whitelist = array(
    'controller1' => array(
     'events' => array(
      'action1'  => array(1 => true, 2 => true), 
      'action2'  => array(1 => true, 2 => true), 
      'action3'  => array(3 => true), 
      'action4'  => array(6 => true) 
     ) 
    ), 
    'user' => array(
     'controller1' => array(
      'action1'  => array(1 => true, 2 => true), 
      'action2'  => array(1 => true, 2 => true) 
     ) 
    ) 
); 

public function canPerformAction ($action, $event_infos, $controller = 'events') { 
    return isset($this->_whitelist[$this->Session->read('Auth.User.role')][$controller][$action][$event_infos['Event']['state_id']]); 
} 
} 
+0

如何當前存儲這些權利?這對於正確的答案至關重要。它是「user_rights」表嗎? – mark

+0

目前它在canEditEvent,canAddProducts,isAdmin系列函數中完成,我在我的控制器中調用,然後發送到視圖。 但的確我在考慮一個Auth助手,它擁有一個表和一個函數,如果在表中找不到,則返回相應的true/false和false。但是我想知道在MVC的想法中,這是否是最好的方式。 – nicolecoco02

回答

1

你需要什麼叫授權,並授予/拒絕通常建立在一個認證一步,這將HTTP請求映射到邏輯用戶的頂部行動的過程。

的授權方案可以通過多種方式來實現,例如簡單的基於角色的規則,即用戶是否完全用於分組的分配權利的目的,或更復雜的ACL(訪問控制列表)。根據您的需求,兩者可以同時用於系統的不同部分。因爲不需要HTTP請求,所以您絕對需要在控制器操作開始時查詢它(如果適用,您可以在AppController中使用標準授權過濾器)。從以前發送的HTTP頁面,但可能是(可能)惡意的,手工製作的。另外,您可能需要在用戶權限後調整用戶界面。也許你會更好地與一幫if報表開始,然後工作了一些日子後,你就可以識別你的需求,建立自己的圖書館/助理/塊/無論以避免重複代碼,緩解讀模板。

+0

感謝您的回答。我確實檢查了這些權利。事實上這個問題不在這裏,我會盡量更清楚。 例如,我有一個操作「editEventProducts」,用戶只有在事件所有者和事件狀態<= 2的情況下才能執行該操作。我在控制器中檢查「isAuthorized」功能是否像魅力一樣。 但我有一個名爲「eventDetails」的頁面,您可以執行一些操作,比如這個,我只想顯示編輯按鈕,只有當您可以做到時。 如果事實上我需要的是「isAuthorized」函數的輸出結果,但是我可以從視圖中正確地獲得它嗎? – nicolecoco02

+0

視圖中的邏輯越少越好。我認爲一種可能的方法是在'eventDetails'操作中檢查用戶權限,並將視圖發送到可執行操作的白名單。這樣視圖就不必查詢授權層本身。模板然後將檢查白名單以決定是否繪製按鈕。白名單可以是一個符號數組,也可以是視圖上的一堆布爾標誌,如'$ canDoThis','$ canDoThat'等等 – Raffaele

+0

Oh不壞。你的意思是我發送一個例如記錄用戶可以執行的操作的基於密鑰的列表,並且檢查例如是否執行isset? 你認爲比調用一個自定義幫助器更好嗎? – nicolecoco02

-2

可以使用

requestAction(string $url, array $options) 

從調用視圖控制器的功能,或者您也可以創建自定義幫助呃這會爲你做到這一點!

+1

是的,我知道我可以打電話給控制器,但這是一個非常糟糕的方式來做到這一點,我真的在尋找最好的方法來做到這一點。 目前我從我的控制器調用函數,並將結果發送到視圖,但它的高級權限變得越來越複雜 – nicolecoco02

+0

在AppController中創建一個動作,它將在beforAction()函數中調用並在那裏設置您的權限。 .. – Anubhav

+0

總有改善的餘地......沒有什麼比最好的 – Anubhav

0

如果您具有預定義的用戶權限(如'admin','moderator','editor','publisher'...),則可以在控制器功能isAuthorized中讀取用戶角色和當前操作並將其設置爲對或錯。

如果您想要每個用戶的自定義權限,您可以將這些值存儲在數據庫中,在isAuthorized函數中讀取它們並根據邏輯確定是否允許他。

我的這個解決方案是一個單獨的表user_permissions這是這樣的:

user_id | action 

這裏的行動將是`控制器/動作」或‘任何你想保存有視圖/塊’或。

我會讀取控制器中當前用戶的所有值,並且如果在數組中找到當前控制器/操作,我會將isAuthorized設置爲true。你也可以將你的邏輯應用到塊中。

2

這聽起來像你只是想根據用戶的權限渲染視圖的某些部分。那麼,在這種情況下,我認爲幫手是正確的選擇。用戶應該已經擁有所有已加載的權限 - 除非它們非常細膩,並且您擁有數千個權限。

檢查這AuthHelper,它允許您檢查用戶是否登錄,對於角色或字段中的一組角色。或者實施您自己的解決方案,以匹配您的許可系統。

請注意,幫助程序依賴於將用戶數據傳遞給視圖變量中的視圖。它也可以配置爲直接從會話的auth部分讀取數據。

這裏是例子取自它的documentation

if ($this->Auth->isLoggedIn()) { 
    echo __('Hello %s!', $this->Auth->user('username')); 
} 

if ($this->Auth->isMe($record['Record']['user_id']) { 
    // or your edit button here 
    echo '<h2>' . __('Your records') . '</h2>'; 
} 

if ($this->Auth->hasRole('admin') { 
    echo $this->Html->link(__('delete'), array('action' => 'delete')); 
} 
+0

是的,我認爲這是最好的選擇。 這有點令人沮喪,因爲它與「isAuthorized」功能完全相同。 – nicolecoco02

+0

你可以在控制器中使用'if($ this-> Auth-> role('admin')){$ this-> set('admin',true); }'然後檢查視圖中的$ admin'。但是'AuthHelper'似乎是一個更好的方法。 –

+0

那麼,你必須爲每個角色設置它,然後在你必須檢查的視圖中,如果(isset($ admin)&& $ admin === true))。幫助程序有助於減少必須編寫的代碼量。它也封裝了檢查邏輯。如果您的應用程序需要特殊的東西,只需將其擴展並加載自定義的AuthHelper別名爲Auth helper即可。 – burzum