我希望能夠基於ACL顯示或隱藏視圖中的某些元素。例如,如果用戶正在查看我的用戶/索引視圖,如果他沒有刪除用戶的權限,我不想顯示「刪除用戶」元素。如果他確實有權限編輯用戶,我做想顯示「編輯用戶」鏈接。基於ACL在CakePHP中修改視圖
我可以一起破解這個,但是對於Cake來說很新鮮我希望有一個優雅的解決方案。我所做過的最好的事情涉及將邏輯放在兩個地方,所以它很難保持。
謝謝!
我希望能夠基於ACL顯示或隱藏視圖中的某些元素。例如,如果用戶正在查看我的用戶/索引視圖,如果他沒有刪除用戶的權限,我不想顯示「刪除用戶」元素。如果他確實有權限編輯用戶,我做想顯示「編輯用戶」鏈接。基於ACL在CakePHP中修改視圖
我可以一起破解這個,但是對於Cake來說很新鮮我希望有一個優雅的解決方案。我所做過的最好的事情涉及將邏輯放在兩個地方,所以它很難保持。
謝謝!
有沒有通用的「優雅的解決方案」:)我一直想做出這樣的事情。無論如何,你可以做到這一點:
覆蓋你的應用程序目錄中的Html Helper - 從/cake/libs/views/helpers/html.php複製到/app/views/helpers/html.php並製作一些Html :: link函數的變化。
例如,您可以檢查url是否包含操作編輯或刪除。
另一部分是從控制器傳遞適當的參數。在AppController :: beforeFilter中,您可以讀取用戶的權限(最好是緩存),並將其傳遞給View的特殊Auth變量。
因此,當您在視圖中擁有權限時,很容易修改鏈接。 :)
正如我所說我沒有做到這一點,但這是我的方式。
有一個不好的地方在於 - 如果原來的Html幫手改變了,你的一個將保持不變。但我相信Html幫手已經夠成熟了,所以對我來說不是一個大問題。
我這樣做在app_controller.php,雖然你可以在特定的控制器中做到這一點。視圖變量$usersIndexAllowed
和$configureAllowed
然後在視圖中的條件語句中使用。
function beforeRender()
{
if($this->layout=='admin')
{
$usersIndexAllowed = $this->Acl->check($user,"users/index");
$configureAllowed = $this->Acl->check($user,"siteAdmins/configure");
}
$this->set(compact('usersIndexAllowed','configureAllowed'));
}
如果你不想與壓倒一切的核心助手浪費時間,你想檢查更自動化的方式(沒有硬編碼的用戶組名和用戶或設置單獨的鏈路特定變量)這裏是我的建議:
當用戶登錄時(在註銷時清除)將所有用戶權限存儲爲會話變量,並創建權限助手以檢查登錄用戶是否具有特定操作的權限。
代碼和示例here
希望幫助
有多種方法來此方案。正如Nik所說的,使用助手爲您做檢查是將外部邏輯「外包」並將其集中以便於使用的一種快速方法。
其實,看看AclLinkHelper - 它確實是你在找什麼,但只限於鏈接。
我知道這是一個古老的問題,但對於任何尋找像我這樣的方式的人...
在AppController中:: beforeFilter可以將ACL組件分配到一個視圖變量,然後用它在你的觀點:
$this->set('user', $this->Auth->user());
$this->set('acl', $this->Acl);
然後在您查看剛剛JUSE它像thie:
if($acl->check(array('User' => $user), 'controllers/groupd/admin_delete')) {
這不一定是最正確的方法,但它確實很好地工作