2011-06-16 100 views
1

我的項目的要求是這樣的:CakePHP的訪問分配基於特定數據訪問

在上面,會有管理員,誰擁有所有d訪問,第一級

在管理員,將有是部門負責人,除了創建部門負責人外,其他部門負責人都可以訪問

在部門負責人之下,還有其他成員將負責管理他們分配的部門明智數據。

現在,所有不同的部門負責人都將擁有自己的信息和成員,並且所有部門主管/成員都可以訪問他們正在輸入/管理的特定記錄。

現在,使用CakePHP的ACL組件,我可以劃分角色及其訪問級別,但所有部門負責人都可以看到其他部門主管的信息,因爲他們具有相同的訪問級別,所有其他成員都可以看到其他成員會員信息差異部門,因爲他們將有相同的訪問級別。

我的項目的複雜性在於 - 他們應該只能看到他們分配或創建的信息/數據,儘管他們與其他人具有相同的級別/角色分配。

任何人都可以推薦我最適合的選項,通過CakePHP的可用插件管理所有這些事情。

我可以通過自定義默認的ACL組件工作,但這需要比預期更多的時間。

任何更好的想法/建議,將不勝感激!

+0

爲什麼不只是在查看個人資料信息時進行檢查?您可以使用Auth來獲取當前用戶。 – JohnP 2011-06-16 10:35:37

+0

@JohnP:好吧,這不僅僅是個人資料信息,還會有很多內容信息和數據,這些信息和數據應該是用戶特定的,只有在特定用戶登錄後才能查看。另外,當Dept Head登錄時,他可以爲他們之下的成員創建訪問權限.. @目前,我們只是準備我們的結構,所以在我們真正開始項目工作之前請求確認。 – 2011-06-16 10:43:17

+0

您可以隨時編寫一個組件,在這些實例中爲您進行檢查。或者在運行時允許/拒絕,具體取決於誰登錄 – JohnP 2011-06-16 10:51:44

回答

2

我看到它的方式,ACL不是那麼神奇。例如:ACL可以管理權限以告知誰可以添加/編輯/刪除產品......但是它無法更改查詢以根據定義的權限對產品進行相應的過濾(例如「來自部門A的用戶只能訪問見部門A的產品「)。實際上這是一個謊言,ACL可以管理它,但它可能不實際,因爲每次添加產品時都必須創建一個ACO,並在AROS_ACOS表中設置權限,由於AROS是樹結構,所以它很容易成爲一個nigthmare,如果你的規劃來查詢數據

我會使用一個group-only ACL來控制訪問某些網頁/行動,並作出這樣的規則:

  • 「部門主管可以訪問頁 '產品列表'和添加/刪除/修改 產品「
  • 」管理員可以訪問 個所有頁面」
  • ‘其他用戶可以訪問 的產品名單',他們可以添加 產品,但不刪除’

,我會相應地調整我的查詢到所連接的用戶,所以在「產品列表」頁面的控制,我會做一些事情,如:

  • 如果用戶連接到blongs系主任然後選擇product.department_id=connected_user.department_id
  • 如果連接的用戶是管理員的所有產品,然後選擇所有產品

如果你有太多的查詢,你不想做成千上萬的if句子,你可以創建一個組件,行爲或者extend the find() method in the app_model。這個想法是捕獲所有查詢,並檢查查詢中使用的模型之一是否具有名爲「department_id」的字段,如果他們確實將model.department_id=connected_user.department_id條件添加到查詢中。

我做了一個網站,可以看到多種語言,每種語言都有它自己的用戶,數據,日誌等,還有一個管理員可以看到所有的信息..它對我很好用=)

祝你好運!

編輯: 我使用的行爲是:

<?php 
class LocalizableBehavior extends ModelBehavior { 

    /** 
    * Filter query conditions with the correct `type' field condition. 
    */ 
    function beforeFind(&$model, $query) 
    { 
     /** 
     * Condition for the paginators that uses joins 
     */ 
     if(isset($query['joins']) && !empty($query['joins'])){ 
      foreach($query['joins'] as $key => $joinTable){ 
       if(ClassRegistry::init($joinTable['alias'])->hasField('lang')){ 
        $query['joins'][$key]['conditions'][] = $joinTable['alias'].".lang = '".$_SESSION['lang']."'"; 
       } 
      } 
     } 

     /** 
     * condition for the normal find queries 
     */ 
     if($model->hasField('lang') && $model->name != "User"){ 
       $query['conditions'][$model->name.'.lang'] = $_SESSION['lang']; 
     } 
     return $query; 
    } 

} 
?> 

它真的很簡單,我更改查詢添加一個條件來匹配當前語言($ _SESSION [「郎」]) 。在控制器中,我需要做的是附加LocalizableBehavior並像往常一樣使用查找方法:

$this->Products->find('all'); 
+0

感謝您分享的想法和信息..它可以幫助我很多,並會繼續提出您的建議,可以與我分享一些文件嗎?像組件/行爲,如果你已經創建了n使用.. – 2011-06-17 04:48:34

+0

humm ...這種行爲方法似乎是有趣的嘗試,謝謝分享 – 2011-06-20 09:29:12

+0

沒問題:)乾杯 – pleasedontbelong 2011-06-20 10:52:00