2013-04-07 68 views
0

我目前正在制定一個計劃在未來與客戶進行溝通的平臺。用戶可以添加到項目並擁有一定的權利。因此,用戶被分配到不同的用戶角色(admin/manager/member/viewer)。管理員可以查看所有項目並允許將其他用戶添加到項目中。如果一個用戶(例如角色:成員)被添加到一個項目中,他將擁有一定的權利(取決於角色),如果沒有,他根本不被允許訪問該項目。將組和用戶添加到項目中的蛋糕ACL

我使用Cake的ACL組件,一切都很好,當我忽視如果用戶被添加到項目或不。我能想到的唯一解決方案不是授予組級別的權限,而是在管理員將用戶添加到項目時在用戶級別授予權限。

有沒有更簡單的方法來解決這個問題?否則,我擔心代碼會變得完全混亂。

回答

0

還有一種方法(我不知道是否更容易,取決於你的觀點)。 ACL組件只能幫助你創建角色,但你需要角色和項目訪問管理,對吧?

我在這個情況下怎麼做:

  1. 在數據庫中創建一個Project_Permission表(給它一個更好的名字,我缺乏想象力)。根據您的項目,創建關聯:用戶可以與許多項目相關聯,並且項目可以有許多用戶訪問它。如果你正在跟蹤蛋糕約定(和你的表被命名爲用戶和項目),它不與你擁有的干擾,該表應該是

    PROJECTS_USERS 
    id 
    project_id 
    user_id 
    created and modified //if you want to 
    
  2. 創建適當的動作,其中管理員(或其他如果用戶選擇,則由您決定) 可以將用戶添加到項目中,並在 之前創建的表中保存該多對多關聯。

  3. 由於項目的授權不是來自ACL組件,您必須自己創建一個「授權」功能。我建議把它放在AppController的beforeFilter()函數中(如果你沒有AppController,你必須在你想要的每一個控制器中都這麼做)。在這個函數中,檢查記錄的用戶是否在現有的表中並且與項目有關聯。喜歡的東西:

    function beforeFilter() { 
        //let's assume you have the project id somewhere, in a global variable like $this->_projectID 
        $user = $this->Session->read('Auth.User.id'); 
        $project = $this->Project->find('first', array('conditions'=>array('id'=>$this->_projectID, 'User.id'=>$user) 
        if (count($project) > 0) { 
         //the user has permission to see the project 
        } else { 
         //he doesn't 
        } 
    } 
    

這是困難的,因爲我不知道你的模型關聯,也不給一個實際的代碼中,你想要的代碼,或者如果你有需要此隨處可見的變量,但我希望你明白這個主意。之後,這只是一個你想如何處理訪問限制的問題(通常包含一個flash消息和重定向)。

我希望這足夠清楚:S