2013-03-11 30 views
-1

好的,我會在前言中說我是蛋糕和ACL以及MVC體系結構的小菜鳥。我正在從它的網站http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/part-two.html繼續一個cakephp教程。我理解本教程的內容,但想知道將這個簡單的基於組的ACL帶到下一個級別的最簡單方法。我已經搜索到無濟於事。所以,在這個問題上。例如,讓我們在上面的教程中稍微修改一下該函數的版本。它只是爲ACO設置ARO權限。在cakephp中限制aro範圍

有許多地區和許多部門,每個部門都有很多用戶。

關係如下: 一個地區有許多部門 - 一對多。 一個地區有很多用戶,用戶可能有很多地區(只要他們屬於該地區的一個部門)。 部門擁有許多用戶,包括許多用戶。

public function initDB() { 
    $group = $this->User->Group; 

    //Allow admins to everything 
    $group->id = 1; 
    $this->Acl->allow($group, 'controllers'); 

    // issue 1) allow district managers to districts, departments, users 
    $group->id = 2; 
    $this->Acl->deny($group, 'controllers'); 
    $this->Acl->allow($group, 'controllers/Districts'); 
    $this->Acl->allow($group, 'controllers/Departments'); 
    $this->Acl->allow($group, 'controllers/Users'); 

    //issue 2) allow department managers to edit departments and users 
    $group->id = 3; 
    $this->Acl->deny($group, 'controllers'); 
    $this->Acl->allow($group, 'controllers/Departments'); 
    $this->Acl->allow($group, 'controllers/Users'); 
    //we add an exit to avoid an ugly "missing views" error message 
    echo "all done"; 
    exit; 

}

好了,這些權限被設置,但它絕對是方便,真正解決問題的一小部分。就目前而言,我只是阻止部門管理人員執行區級功能。地區管理員和部門管理員都可以不受限制地執行用戶CRUD

我想要做的是將每個管理員類型USER CRUD的範圍限制爲僅駐留在其部門或地區內的用戶。例如,Department Admin Foo無法刪除其他部門管理員的用戶,並且Dist Admin Bar不能將所有其他Dist管理員的用戶名改爲nancy。

大聲笑。我對如何完成這件事感到非常茫然。

我想一種方法會得到一個管理員的排名,例如dist管理員,然後找出他是哪個地區的用戶。最後,將該分區中的所有用戶都歸入變量$ userScope。再一次,我是蛋糕PHP的新手,並不確定如何執行這個提議,即使這是一個好主意並且是處理這個問題的最好方法。有什麼建議麼??提前致謝!!!

編輯:有用答案,@nicolae。然而,它似乎仍然可以編寫一個函數,返回所有給定的管理員(任何給定的aco)允許編輯的所有用戶。對我來說似乎是這樣,因爲我假設管理員,他/她自己是返回的用戶羣的一部分。例如,dist 9的dist管理員駐留在dist 9;同樣,DEPT 1的部門管理員,駐留在部門1.

could i write something like: 

public getUserScope(){ 
$id = $this->Auth->user('id'); 
$dept = $this... 
$dist = $this... 
$access_level = $this->Session->read('Auth.User.group_id'); 
if($access_level == 3){ 
     //get all users in this user's dept 
} elseif($access_level == 2) { 
    //find all users in this user's dist 
} elseif($access_level == 1) { 
     //find all users 
} 
} 

哎喲。授予所有將這些信息彙總在一起的連接表,在實際打印時,這看起來像medusas頭髮。你能看到我的邏輯線嗎?這對我來說有點難以表達。讓我知道我是否應該進一步澄清。

回答

1

所以你試圖建立了基於多組ID控制器/動作管理限制的ACL系統 - 你需要部 -地區性限制。
據我所知,CakePHP中的嵌入式ACL系統可以用而不是來管理這個級別的限制。

作爲一個解決方案,我建議你,可以讓用戶以他們所需要訪問(例如部門管理員有ACL訪問用戶CRUD接口),並插入在控制器的具體限制的地方。

function editUserFromDepartment($userId = NULL) { 
    // Custom ACL check 
    if (! $this->__checkDepartmentByUserId($userId)) { 
     // Show the user a custom error message and redirect him to index page 
    } 

    // User editing code ... 
} 

function __checkDepartmentByUserId($userId) { 
    $dept = $this->Department->getByUserId($userId); 

    // Check if the current user belongs to this department 
    $currentUserDepartmentId = $this->Session->read('Auth.User.department_id'); 

    return ($dept['Department']['id'] != $currentUserDepartmentId); 
} 

祝你好運,讓我知道如果我的解釋是很清晰。

尼古拉

編輯(試圖回答@託德的編輯): 我明白你的意思。 您的代碼旨在獲取全部當前用戶有權訪問的用戶。 而不是那個,我會有一個基於事件的方法:當用戶X試圖編輯,執行一個查詢,發現是否允許Auth.User執行此操作對用戶X

E.g.你(託德)正試圖編輯我的個人資料(NicolaeS)來改變我的員工ID,因爲我目前的錯誤。
功能$this->getUserScope('user-ID-of-NicolaeS')將檢查您的部門ID 區號是否與main相同,並根據此檢查允許/禁止您繼續執行您的操作。

這看起來很清楚/簡單嗎?

映入眼簾, 尼古拉·

+0

@Todd所以我進一步在回答您的編輯我的答案。請檢查以上。 – NicolaeS 2013-03-12 15:48:16