Trang

Thứ Năm, 18 tháng 7, 2013

Zend_Acl phân quyền cho người dùng (ứng dụng trên nhiều module ) [Zend Framework]

Trong phần này, chúng ta sẽ thực hiện việc cài đặt các Role và Resource một lần tập chung cho tất cả các module, controller.
I. Lý thuyết

Chúng ta sẽ xem lý thuyết về Zend_Acl ở đây:
Zend_Acl phân quyền cho người dùng (ứng dụng trên 1 controller)

II. Xây dựng ứng dụng

Bước 1: Xây dựng 1 thư viện hàm riêng.
Các bước xây dựng xem ở đây:
Tạo thư viện hàm riêng trong Zend Framework

Bước 2: Xây dựng đối tượng Acl riêng của chúng ta và cài đặt các Role
Vào thư mục library/My tạo 1 file Acl.php với nội dung
<?php
class My_Acl extends Zend_Acl
{
  public function __construct()
   {
      // Add Role
      $this->addRole(new Zend_Acl_Role('user'))
           ->addRole(new Zend_Acl_Role('moderator'))
           ->addRole(new Zend_Acl_Role('admin'));
           
      // Add Resource
      // Các Controller trong Module Default
      $this->addResource(new Zend_Acl_Resource('default:index'));
      // Các Controller trong Module Admin 
      $this->addResource(new Zend_Acl_Resource('admin:index'));
      
      // Phân quyền
      // User
      $this->allow('user','default:index',null);// Vào tất cả các action của C-Index trong M-Default
      // Moderator
      $this->allow('moderator','default:index',null); // Vào tất cả các action của C-Index trong M-Default
      $this->allow('moderator','admin:index',array('index','insert','update')); // Vào được các action index, insert, update của C-Index trong M-Admin
      // Admin
      $this->allow('admin',null,null); // Vào được tất cả
      
      $this->allow(null,'default:index','notpermission');// Tất cả các Role đều vào được action notpermission của C-Index trong M-Default
      
   }
}

Bước 3: Kiểm tra quyền chứng thực và kiểm tra cấp độ của người đăng nhập
Vào thư mục library/My tạo một file Aclplugin.php với nội dung
<?php
class My_Aclplugin extends Zend_Controller_Plugin_Abstract
 {
     protected $_acl;
     public function __construct($acl)
      {
         $this->_acl = $acl;  
      }
     public function preDispatch(Zend_Controller_Request_Abstract $request)
      {
          // Gọi chứng thực
          $auth = Zend_Auth::getInstance();
          if( $auth->hasIdentity() ) // Nếu có chứng thực
           { 
               // Lấy thông tin đã ghi vào session
               $infoUserData = $auth->getIdentity();
               // Lấy cấp độ người dùng
               $level = $infoUserData->level;
               // Tạo Role
               $role = "";
               switch($level)
                {
                   case 1: $role = "admin";break;
                   case 2: $role = "moderator"; break;
                   case 3: $role = "user";break;
                   default:$role = "user";
                }
              // Lấy Request
              // Module
              $module = $request->getModuleName();
              // Controller
              $controller = $request->getControllerName();
              // Action 
              $action = $request->getActionName();
              
              //Tạo Resource
              $resource = $module.":".$controller;
              
              // Chuyển hướng người dùng nếu không được phép truy cập
              if( !$this->_acl->isAllowed($role,$resource,$action) )
               {
                    $request->setModuleName('default')
                            ->setControllerName('index')
                            ->setActionName('notpermission');
               }
              
           }
      }
 }

Hàm preDispatch trong Aclplugin cho phép chúng ta lấy tên module, tên controller và tên action của request trước khi các request này được gửi tới Controller. Nếu người dùng không được phép truy cập thì mình sẽ chuyển request đến một action do mình chỉ định(ở đây là action notpermission).

Bước 4: Khởi tạo đối tượng Acl và khai báo Aclplugin cho front Controller biết
Trong file bootstrap.php
<?php
Zend_Session::start();
// Khai báo đối tương Zend_Acl
$acl = new My_Acl();
// Khai báo Aclplugin cho front Controller biết
$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin(new My_Aclplugin($acl));
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
 {
   ...
 }

Bước 5: Viết notpermissionAction() trong C-Index của M-Default
public function notpermissionAction()
{
  echo "You don't have permission to access this action ";
  $this->getHelper('ViewRenderer')->setNoRender();
}

Bước 6: Viết hàm preDispatch trong C-Index của M-Admin để chứng thực người dùng đăng nhập, nếu chưa đăng nhập thì chuyển về form Login
public function preDispatch()
{
  $auth = Zend_Auth::getInstance();
  if( !$auth->hasIdentity() )
   {
       $this->_redirect(HOST_PATH.'/default/index/login');
    }
}

Nguồn: Sưu tầm Internet

2 nhận xét:

  1. Nhận xét này đã bị tác giả xóa.

    Trả lờiXóa
  2. autoloadernamespaces.My = "My_"

    coppy dòng này vào application.php(configs)

    Trả lờiXóa