2010-07-19 63 views
6

我希望能夠基於ACL顯示或隱藏視圖中的某些元素。例如,如果用戶正在查看我的用戶/索引視圖,如果他沒有刪除用戶的權限,我不想顯示「刪除用戶」元素。如果他確實有權限編輯用戶,我想顯示「編輯用戶」鏈接。基於ACL在CakePHP中修改視圖

我可以一起破解這個,但是對於Cake來說很新鮮我希望有一個優雅的解決方案。我所做過的最好的事情涉及將邏輯放在兩個地方,所以它很難保持。

謝謝!

回答

1

有沒有通用的「優雅的解決方案」:)我一直想做出這樣的事情。無論如何,你可以做到這一點:

覆蓋你的應用程序目錄中的Html Helper - 從/cake/libs/views/helpers/html.php複製到/app/views/helpers/html.php並製作一些Html :: link函數的變化。

例如,您可以檢查url是否包含操作編輯或刪除。

另一部分是從控制器傳遞適當的參數。在AppController :: beforeFilter中,您可以讀取用戶的權限(最好是緩存),並將其傳遞給View的特殊Auth變量。

因此,當您在視圖中擁有權限時,很容易修改鏈接。 :)

正如我所說我沒有做到這一點,但這是我的方式。

有一個不好的地方在於 - 如果原來的Html幫手改變了,你的一個將保持不變。但我相信Html幫手已經夠成熟了,所以對我來說不是一個大問題。

1

我這樣做在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')); 
} 
1

如果你不想與壓倒一切的核心助手浪費時間,你想檢查更自動化的方式(沒有硬編碼的用戶組名和用戶或設置單獨的鏈路特定變量)這裏是我的建議:

當用戶登錄時(在註銷時清除)將所有用戶權限存儲爲會話變量,並創建權限助手以檢查登錄用戶是否具有特定操作的權限。

代碼和示例here

希望幫助

0

有多種方法來此方案。正如Nik所說的,使用助手爲您做檢查是將外部邏輯「外包」並將其集中以便於使用的一種快速方法。

其實,看看AclLinkHelper - 它確實是你在找什麼,但只限於鏈接。

4

我知道這是一個古老的問題,但對於任何尋找像我這樣的方式的人...

在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')) { 

這不一定是最正確的方法,但它確實很好地工作