2010-02-16 26 views
9

Tôi đã dựa trên đơn đăng ký của mình trên Khung công tác Zend. Tôi đang sử dụng Zend_Auth để xác thực, nhưng tôi không chắc chắn nếu Zend_Acl sẽ làm việc cho tôi bởi vì, thẳng thắn, các ví dụ tôi đã nhìn thấy hoặc là quá đơn giản cho nhu cầu của tôi hoặc gây nhầm lẫn cho tôi.Zend ACL có phù hợp với nhu cầu của tôi không?

Tôi đang nghĩ đến các yếu tố trong ứng dụng của mình là Tài nguyên và các Tài nguyên này có thể có các Đặc quyền. Các vai trò có chứa Đặc quyền tài nguyên được định nghĩa động được chỉ định cho người dùng. Tôi đang lưu trữ thông tin này trong các bảng được chuẩn hóa.

  1. Người dùng có một vai trò
  2. Một Vai trò có thể có nhiều tài nguyên
  3. Tài nguyên có thể có nhiều quyền ưu đãi

Vai trò thực sự chỉ là tập hợp của các đặc quyền tài nguyên không có hệ thống cấp bậc. Ví dụ về Tài nguyên sẽ là 'Trang'. Mọi người đều có thể xem các trang, nhưng người dùng được xác thực sẽ cần các đặc quyền 'thêm', 'chỉnh sửa' hoặc 'xóa' để làm bất kỳ điều gì khác với các trang.

Lưới này có Zend ACL không? Tôi có nghĩ ACL theo cách sẽ tạo ra vấn đề cho tôi không?


My Giải pháp

Typeonerror nhận được tín dụng, nhưng đây là giải pháp cụ thể của tôi.

tôi mở rộng Zend_Acl để đơn giản hóa việc sử dụng của tôi bởi vì tôi chỉ tải về vai trò của người sử dụng hiện tại:

class My_Acl extends Zend_Acl 
{ 
    protected $_role_id; 

    public function setRole($role_id) 
    { 
     $this->_role_id = $role_id; 
     return $this->addRole($role_id); 
    } 

    public function getRole() 
    { 
     return $this->_role_id; 
    } 

    public function deny($resource, $privilege) 
    { 
     return parent::deny($this->_role_id, $resource, $privilege); 
    } 

    public function allow($resource, $privilege) 
    { 
     return parent::allow($this->_role_id, $resource, $privilege); 
    } 

    public function isAllowed($resource, $privilege) 
    { 
     return parent::isAllowed($this->_role_id, $resource, $privilege); 
    } 
} 

Để cư ACL tôi thực hiện một truy vấn mà trả resource, privilege, và role_id cột. Cột role_id không có trong tập kết quả nếu vai trò của người dùng không có đặc quyền đó.

$acl = new My_Acl(); 

$auth = Zend_Auth::getInstance(); 
if ($auth->hasIdentity()) { 
    $userInfo = $auth->getStorage()->read(); 
    $acl->setRole($userInfo->role_id); 
} else { 
    $acl->setRole(''); 
} 

// QUERY HERE 

foreach ($privileges as $privilege) { 
    if (!$acl->has($privilege['resource'])) { 
     $acl->addResource($privilege['resource']); 
    } 
    if (is_null($privilege['role_id'])) { 
     $acl->deny($privilege['resource'], $privilege['privilege']); 
    } else { 
     $acl->allow($privilege['resource'], $privilege['privilege']); 
    } 
} 

Trả lời

10

Đó chính xác là cách hoạt động và tôi nghĩ bạn đang suy nghĩ về nó một cách chính xác. Bạn có thể thêm tài nguyên của mình và sau đó thêm các đặc quyền để cho phép một số vai trò người dùng nhất định truy cập chúng. Ví dụ: trong CMS của tôi, tôi có "nhà phát triển", "quản trị viên" và "người dùng". Trong mã bên dưới, tôi thêm quyền truy cập chung và sau đó xóa một số hành động và phương thức cụ thể khỏi quyền truy cập của người dùng nhất định. Tất nhiên điều này khá cụ thể đối với ứng dụng của tôi nhưng về cơ bản, bạn phải nhận vai trò của người dùng từ auth-> getIdentity() (hoặc tương tự) và sau đó thêm vai trò/tài nguyên của bạn từ cơ sở dữ liệu.

<?php 

/** 
* @author  Benjamin Borowski <[email protected]> 
* @copyright Copyright (c) Typeoneerror Studios http://typeoneerror.com 
* @version $Id$ 
* @category Typeoneerror 
* @package Acl 
*/ 

/** 
* Defines basic roles and resources for an application as 
* well as a Content Management System (CMS). 
* 
* Zend_Acl provides a lightweight and flexible access control list 
* (ACL) implementation for privileges management. 
* 
* {@inheritdoc} 
* 
* @author  Benjamin Borowski <[email protected]> 
* @copyright Copyright (c) Typeoneerror Studios http://typeoneerror.com 
* @version $Id$ 
* @category Typeoneerror 
* @package Acl 
*/ 
class Typeoneerror_Acl extends Zend_Acl 
{ 
    /** 
    * Constructor function. 
    * 
    * Creates basic roles and resources and adds them to Acl. 
    * 
    * {@inheritdoc} 
    * 
    * @return Typeoneerror_Acl 
    */ 
    public function __construct() 
    { 
     //--------------------------------------- 
     // ROLES 
     //--------------------------------------- 

     $this->_addRole("guest") 
      ->_addRole("member", "guest") 
      ->_addRole("admin", "member") 
      ->_addRole("developer", "admin"); 

     //--------------------------------------- 
     // FRONT-END RESOURCES 
     //--------------------------------------- 

     $this->_add("default"); 

     //--------------------------------------- 
     // BACK-END RESOURCES 
     //--------------------------------------- 

     $this->_add("cms") 
      ->_add("cms:articles", "cms") 
      ->_add("cms:auth", "cms") 
      ->_add("cms:bug-report", "cms") 
      ->_add("cms:calendar", "cms") 
      ->_add("cms:categories", "cms") 
      ->_add("cms:comments", "cms") 
      ->_add("cms:error", "cms") 
      ->_add("cms:galleries", "cms") 
      ->_add("cms:pages", "cms") 
      ->_add("cms:photos", "cms") 
      ->_add("cms:tags", "cms") 
      ->_add("cms:users", "cms"); 

     //--------------------------------------- 
     // GUEST PERMISSIONS 
     //--------------------------------------- 

     $this->allow("guest", "default") 
      ->allow("guest", "cms:auth")   // -- guests can attempt to log-in 
      ->allow("guest", "cms:error")   // -- guests can break stuff 
      ->allow("guest", "cms:bug-report"); // -- guests can report bugs 

     //--------------------------------------- 
     // ADMIN PERMISSIONS 
     //--------------------------------------- 

     $this->allow("admin") 
      ->deny("admin", null, "purge")      // -- admins cannot purge (normally) 
      ->deny("admin", "cms:comments", "create");   // -- only devs can create a comment 

     //--------------------------------------- 
     // DEVELOPER PERMISSIONS 
     //--------------------------------------- 

     $this->allow("developer");    // -- unrestricted access 

     return $this; 
    } 

    /** 
    * Adds a Resource having an identifier unique to the ACL. 
    * 
    * @param Zend_Acl_Resource_Interface $resource  The resource to add 
    * @param Zend_Acl_Resource_Interface|string $parent A parent resource it inherits from 
    * @return Typeoneerror_Acl       Reference to Acl class 
    */ 
    protected function _add($resource, $parent = null) 
    { 
     $this->add(new Zend_Acl_Resource($resource), $parent); 

     return $this; 
    } 

    /** 
    * Wrapper for <code>addRole</code> 
    * 
    * @param Zend_Acl_Resource_Interface $resource  The resource to add 
    * @param Zend_Acl_Resource_Interface|string $parents Parent resources it inherits from 
    * @return Typeoneerror_Acl       Reference to Acl class 
    */ 
    protected function _addRole($role, $parents = null) 
    { 
     $this->addRole(new Zend_Acl_Role($role, $parents)); 

     return $this; 
    } 

} 

Sửa

Guess Tôi cũng nên giải thích rằng tôi có một Typeoneerror_Controller_Plugin_Acl được sử dụng bất cứ khi nào bất kỳ tài nguyên được yêu cầu. Ở đây tôi tạo "thẻ" mà tài nguyên được yêu cầu tạo và kiểm tra xem người dùng có quyền truy cập vào thẻ đó hay không:

$controller = $request->controller; 
    $action = $request->action; 
    $module = (empty($request->module)) ? "default" : $request->module; 

    // -- this ends up like "cms:articles" just like my resources 
    $resource = $module . ":" . $controller; 

    if (!$this->__acl->has($resource)) 
    { 
     $resource = $module; 
    } 

    // -- the good stuff. check if the user's role can access the resource and action 
    if (!$this->__acl->isAllowed($role, $resource, $action)) 
    { 
     //more code 
    } 
+0

Tôi đang thấy cấp Người dùng, Vai trò và Tài nguyên trong ví dụ của bạn. Tôi có User, Role, Resource, Privilege. Người dùng có một vai trò, một vai trò có thể có nhiều tài nguyên và một tài nguyên có thể có nhiều đặc quyền. Tôi có hiểu nhầm điều gì đó trong giải pháp của bạn không? – Sonny

+0

Âm thanh về quyền. Cách người dùng được thiết lập, mỗi người dùng thừa kế các đặc quyền từ cha mẹ của nó.Vì vậy, "quản trị" nhận được tất cả các đặc quyền "khách" và "thành viên". Dưới quyền quản trị, tôi cho phép "tất cả" và sau đó từ chối hành động "thanh trừng" trên tất cả các tài nguyên và từ chối hành động "tạo" chỉ dựa trên "cms: comments". Vì vậy, họ vẫn có thể truy cập các hành động "cms: comments-> view" hoặc "cms: comments-> average". – typeoneerror

+0

Đã thêm một số mã. – typeoneerror

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