2013-01-09 110 views
0

因爲我一直在試圖找到一個很好的方法來做到這一點大約兩個星期,我認爲這是一個好主意,只是問。CakePHP ACL:如何實現這種情況?

我有兩個User角色:editoradmin。每editor有一個範圍Region s分配給他,通過$hasAndBelongsToMany

在應用程序中,我也有一個模型Event,其中每個有Region,通過region_id。我想確保每個editor都可以查看,編輯,刪除和執行其他任務,只有那些位於他的任務中的RegionEvent。一個admin用戶當然可以編輯任何東西。

我該如何在CakePHP模型和控制器中最輕鬆地實現這一點?

回答

1

您可以在EventsControlleredit方法的前幾行處理此操作。查找事件的區域,然後檢查登錄的編輯器是否爲該區域的編輯器。所有你需要做的就是確保當用戶登錄時,他/她的角色被保存在AuthComponent的會話中。例如:

public function edit($event_id = null) { 
    if($this->Auth->user('role') == "editor") { 
     // User is logged in as editor, check if the Event region matches his regions. 
     $event = $this->Event->findById($event_id); // Get the event 
     $user = $this->Event->User->findById($this->Auth->user('id')); // Get the user (Assuming an Event belongsTo user, otherwise you'll have to load the model first). 

     if(!array_search($event['Event']['region_id'], $user['User']['Region'])) { 
      // The event's region wasn't found in the Regions for the User, deny access 
      $this->Session->setFlash(__('You are not authorized to edit this event.')); 
      $this->redirect(array('action' => 'view', $event_id)); 
     } 
    } 
} 

所以基本上你做任何邏輯之前,您檢查用戶是否是一個編輯器,如果是這樣,如果該地區他的關聯匹配的地區爲當前事件。如果它沒有設置閃光消息,並且用戶被踢回view的事件視圖。

+0

那麼根本就不需要ACL? 'isAuthorized'是什麼? – Lanbo

+0

ACL僅用於確定經過身份驗證的用戶是否有權訪問控制器中的特定操作。在這種情況下,編輯者和管理員都可以訪問,如果他們被允許編輯特定事件,則只需要額外的檢查。 ACL不會檢查那種模型關係。 – Oldskool

+0

謝謝澄清。 – Lanbo