2011-12-22 60 views
7

Tôi bắt đầu sử dụng mẫu MVC cách đây nửa năm và tôi vẫn có một số hiểu lầm.Điều khiển truy cập dựa trên vai trò - mẫu MVC chính xác

Bây giờ tôi muốn thực hiện kiểm soát truy cập dựa trên vai trò trong ứng dụng của mình. Tuy nhiên, câu hỏi của tôi không phải về RBAC, nó là về MVC.

thực hiện của tôi về RBAC là thế này: user-> role-> phép như vậy mỗi người sử dụng (ví dụ: userA.) Có thể có nhiều vai trò, và mỗi vai trò có thể (ví dụ: đọc, biên tập viên, quản trị viên.) có nhiều quyền (đọc, cập nhật, xóa, v.v.).

bảng MySQL

  • người dùng (danh sách người dùng)
  • vai trò (danh sách các vai trò)
  • quyền (danh sách được phép)
  • roles_permissions (danh sách roles-> quyền kết nối . ex. editor-> update)
  • users_roles (danh sách người dùng-> vai trò kết nối. ex. userA-> editor)

Bây giờ câu hỏi của tôi là Tôi nên triển khai điều này như thế nào trong MVC? Có một mô hình riêng biệt cho: người dùng, vai trò, quyền, vai trò_permissions, users_roles, hơn là có một lớp authManager tạo người dùng, vai trò, quyền, roles_permissions và user_roles? Bằng cách này có đúng không? Có cách nào tốt hơn, có lẽ thanh lịch hơn không?

Trả lời

8

Về cơ bản tôi muốn gắn bó với một trong nhiều thư viện Kohana ACL đã tồn tại thay vì viết thư của riêng bạn (hoặc ít nhất là thử xem chúng có phù hợp với nhu cầu của bạn) hay không.

Bạn có thể muốn kiểm tra chủ đề này (Wouter A1, A2 và ACL module) - http://forum.kohanaframework.org/discussion/1988/releases-a1-authentication-acl-acl-for-kohana-a2-object-level-authorization/p1
Nó đang được cập nhật liên tục và duy trì và nó có sẵn cho phiên bản 3.2 là tốt.

Nếu bạn cảm thấy module Wouter đang phức tạp, bạn cũng có thể kiểm tra mô-đun Vendo ACL mà là rất đơn giản và loại bỏ rất nhiều biến chứng - https://github.com/vendo/acl
ví dụ làm thế nào để sử dụng nó - http://forum.kohanaframework.org/discussion/9517/getting-started-with-vendo-acl/p1

2

Thông thường, bạn sẽ muốn sử dụng thư viện/lớp học ACL vì đây là ACL mà bạn mô tả. Tôi không biết Kohana nhưng từ một google nhanh chóng tôi đã tìm thấy thư viện ACL Kohana này. https://github.com/synapsestudios/kohana-acl

Nhưng về cơ bản bạn thực sự cần các mô hình để quản lý các thực thể riêng biệt của mình trong thư viện ACL như người dùng, vai trò và quyền. Sau đó, nói chuyện với ACL-api trong bộ điều khiển của bạn hoặc các thư viện khác để xác định quyền truy cập vào các phần cụ thể trong ứng dụng của bạn.

1

Tôi đang sao chép/dán mã của trình điều khiển ứng dụng chính của KohanaPHP giả sử rằng chúng tôi đã bao gồm Zend_ACL.

Xin lưu ý rằng tôi có quyền dựa trên người dùng chứ không phải quyền dựa trên nhóm ... Mặc dù điều này có thể dễ dàng chỉnh sửa.

<?php 

defined('SYSPATH') OR exit('No direct script access.'); 

class Controller_Application extends Controller_Template 
{ 

    protected static $acl; 
    public $template = 'default'; 

    public function before() 
    { 
     parent::before(); 
     session_start(); 
     self::$acl = new Zend_Acl(); 
     $this->set_permissions($_SESSION['userid']); 
    } 

    protected function check_access($resource, $privilege, $redirect = TRUE) 
    { 
     $permission = (self::$acl->has($resource) AND self::$acl->isAllowed($_SESSION['userid'], $resource, $privilege)); 
     if (!$permission AND $redirect) 
      $this->request->redirect('user/denied'); 
     elseif (!$permission AND !$redirect) 
      return FALSE; 
     elseif ($permission AND !$redirect) 
      return TRUE; 
    } 

    protected function set_permissions($user_id) 
    { 
     $result = DB::select() 
      ->from('permissions') 
      ->where('user_id', '=', $user_id) 
      ->execute() 
      ->as_array(); 
     self::$acl->addRole(new Zend_Acl_Role($user_id)); 
     foreach ($result AS $permission) 
     { 
      if (!self::$acl->has($permission['resource'])) 
       self::$acl->add(new Zend_Acl_Resource($permission['resource'])); 
      self::$acl->allow($user_id, $permission['resource'], $permission['privilege']); 
     } 
    } 
} 

?> 

Sau đó, tôi kiểm tra quyền truy cập trong bộ điều khiển như sau: $this->check_access('events', 'add');.

1

tôi biết con đường mòn là lạnh , nhưng một dự án mới đã xuất hiện:

PHP-RBAC là một NIST cấp bậc PHP Cấp 2 Tiêu chuẩn Kiểm soát quyền truy cập dựa trên vai trò và khá trưởng thành. Nó cũng là một dự án OWASP.

Tôi hy vọng bạn thưởng thức nó tại http://phprbac.net

nó được sử dụng trong jframework trong một cách đó là cách tiêu chuẩn của việc kết hợp RBAC trong một mô hình MVC.

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