2010-07-19 35 views
6

Tôi muốn có thể hiển thị hoặc ẩn các phần tử nhất định trong chế độ xem dựa trên ACL. Ví dụ: nếu người dùng đang xem chế độ xem Người dùng/chỉ mục của tôi, tôi không muốn hiển thị phần tử 'Xóa người dùng' nếu anh ấy không có quyền xóa người dùng. Nếu anh ta không có quyền chỉnh sửa người dùng, tôi làm muốn hiển thị liên kết 'Chỉnh sửa người dùng'.Sửa đổi chế độ xem dựa trên ACL trong CakePHP

Tôi có thể cùng nhau hack, nhưng lại rất mới mẻ với Cake Tôi hy vọng rằng có một giải pháp thanh lịch. Điều tốt nhất tôi đã làm liên quan đến việc giữ logic ở hai nơi, vì vậy nó là địa ngục để duy trì.

Cảm ơn!

Trả lời

1

Không có "giải pháp thanh lịch" chung chung :) Tôi luôn muốn làm điều đó. Dù sao bạn có thể làm như thế nào:

Ghi đè Trình trợ giúp Html trong thư mục ứng dụng của bạn - tạo một bản sao từ /cake/libs/views/helpers/html.php đến /app/views/helpers/html.php và thực hiện một số thay đổi trong hàm Html :: link.

Ví dụ: bạn có thể kiểm tra xem url có chứa tác vụ chỉnh sửa hoặc xóa hay không.

Phần khác là chuyển các thông số thích hợp từ bộ điều khiển. Trong AppController :: beforeFilter bạn có thể đọc các quyền của người dùng (nó tốt hơn để được lưu trữ) và chuyển nó trong một biến Auth đặc biệt cho View.

Vì vậy, khi bạn có quyền trong Chế độ xem, thật dễ dàng để sửa đổi liên kết. :)

Như tôi đã nói tôi đã không làm điều đó trong ví dụ thực tế, nhưng đây là cách tôi sẽ làm điều đó.

Có 1 điểm xấu trong đó - nếu trình trợ giúp Html gốc bị thay đổi, trình trợ giúp của bạn sẽ vẫn giữ nguyên. Nhưng tôi tin rằng người trợ giúp Html đủ trưởng thành nên tôi không phải là vấn đề lớn.

1

Tôi làm như thế này trong app_controller.php, mặc dù bạn cũng có thể làm điều đó trong bộ điều khiển cụ thể. Biến chế độ xem $usersIndexAllowed$configureAllowed sau đó được sử dụng trong các câu lệnh có điều kiện trong chế độ xem.

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

Trong trường hợp bạn không muốn lộn xộn xung quanh với những người giúp đỡ lõi trọng và bạn muốn một cách tự động hơn về kiểm tra (không cứng mã hóa tên nhóm người dùng và người dùng hoặc thiết lập các biến liên kết cụ thể riêng) đây là của tôi Đề nghị:

Lưu trữ tất cả quyền người dùng dưới dạng phiên phiên khi người dùng đăng nhập (xóa đăng xuất) và tạo người trợ giúp quyền để kiểm tra xem người dùng đã đăng nhập có quyền đối với một hành động cụ thể hay không.

mã và ví dụ here

hy vọng rằng sẽ giúp

0

Có nhiều cách tiếp cận để kịch bản này. Như Nik đã nói, sử dụng một người trợ giúp để thực hiện kiểm tra cho bạn là một cách nhanh chóng để "thuê ngoài" logic và tập trung nó để dễ sử dụng.

Thực ra, hãy xem AclLinkHelper - nó thực hiện chính xác những gì bạn đang tìm kiếm, tuy nhiên chỉ giới hạn ở các liên kết.

4

Tôi biết đây là một câu hỏi cũ nhưng hiện tại, đối với bất kỳ ai đang tìm kiếm một cách như tôi ...

Trong AppController :: beforeFilter bạn có thể gán các thành phần ACL cho một biến quan điểm và sau đó sử dụng nó theo quan điểm của bạn:

$this->set('user', $this->Auth->user());  
$this->set('acl', $this->Acl); 

Và sau đó trong bạn xem chỉ JUSE nó như thie:

if($acl->check(array('User' => $user), 'controllers/groupd/admin_delete')) { 

Đây không nhất thiết là cách chính xác nhất để thực hiện nhưng nó hoạt động độc đáo

Các vấn đề liên quan