Zend_Acl
今天介紹Zend Acl的用途,意思就是權限控制。它配合Zend_Auth,Plugin來用的話,會幫你省卻很時間。
先教大家如何使用Zend_Acl
1.建立角色
2.建立資源
3.對每個來源加入角色權限控制
//建立一個zend_acl object
$acl = new Zend_Acl();
1.建立角色,我們建立最簡單的二個角色好了(guest,admin)
$guest = new Zend_Acl_Role('guest');
$admin = new Zend_Acl_Role('admin');
//把群組加到acl object裡
$acl->addRole($guest);
$acl->addRole($admin);
2.建立資源,建立admin page,auth page
$admin_resource = new Zend_Acl_Resource('admin_index');
$auth_resource = new Zend_Acl_Resource('auth_index');
//把資源加到acl object裡
$acl->add($admin_resource);
$acl->add($auth_resource);
3.對每個來源加入角色權限控制,只有登入後才能有權限對admin page進行操作,如果使用者没有登入,就會redirect使用者到auth page
//第一個param是角色,第二個param是controller,第三個param是action,第四個param是自定的callback(註:null代表全部)
//上邊的意思就是說,不准許任何角色去訪問任何的資源(controller/action)
$acl->deny(null,null,null);
//guest有權限訪問auth module->index controller->login action
$this->allow('guest','auth_index',array('login','index'));
//admin有權限訪問所有的資源,最後的param是用來驗証使用者登入狀態,如果使用者登入才會准許
$this->allow('admin',null,null,new My_Acl_AuthAssert($auth));
ACL大致就是這樣設定的。
/********************************************************************
* Zend_Auth+Zend_Acl一起使用
*********************************************************************/
Zend_Auth我不多說了請自行看我之前所寫的文章
1.首先建立一個acl object,設定好acl的權限控制(同上)
2.使用controller plugin功能,在preDispatch中去檢查使用者是否對該controller/action有權限
index.php
<?
//建立Zend_Acl Object,權限控制
。。。。。
//建立Zend_Auth Object
。。。。
//把helper path加進去,因為controller plugin需要使用到My_Plugin_Auth class
$view = new Zend_View();
$view->addHelperPath(APPLICATION_DIRECTORY.'/library/My/View/Helper','My_View_Helper');
$viewRender = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRender->setView($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRender);
$controller = Zend_Controller_Front::getInstance();
$controller->addControllerDirectory('application/auth/controllers','auth');
$controller->addControllerDirectory('application/admin/controllers','admin');
//加入controller plugin,檢查使用者權限
$controller->registerPlugin(new My_Plugin_Auth($auth,$acl));
?>
My/Acl/AuthAssert.php
/**
* 檢查使用者是否登入
*/
class My_Acl_AuthAssert implements Zend_Acl_Assert_Interface {
/*
* @param Object
*/
private $_auth;
/*
* @param Object Zend_Auth
*/
public function __construct(Zend_Auth $auth)
{
$this->_auth = $auth;
}
/*
* @param Object Zend_Acl
* @param Object Zend_Acl_Role_Interface
* @param Object Zend_Acl_Resourece_interface
*
* @return boolean
*/
public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role = null, Zend_Acl_Resource_Interface $resource = null, $privilege = null) {
return $this->_isLogin();
}
/*
* check user login status
*
* @return boolean
*/
private function _isLogin()
{
//你所需要的檢查程式碼
}
}
?>
My/Plugin/Auth.php
<?php
/*
* 在preDispatch中去檢查使用者是否對該controller/action有權限
*/
class My_Plugin_Auth extends Zend_Controller_Plugin_Abstract {
/*
*@param Object
*/
private $_auth;
/*
* @param Object
*/
private $_acl;
/*
* @param Array
*/
private $_no_auth = array(
'module' => 'auth',
'controller' => 'index',
'action' => 'index'
);
/*
* @param Array
*/
private $_no_acl = array(
'module' => 'admin',
'controller' => 'index',
'action' => 'index'
);
public function __construct(Zend_Auth $auth,Zend_Acl $acl)
{
$this->_auth = $auth;
$this->_acl = $acl;
}
public function preDispatch()
{
$request = $this->getRequest();
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
$resource = $module.'_'.$controller;
$acl = $this->_acl;
//設定使用者角色,如果登入的話,把使用者設定成admin角色
if(isset($_SESSION['AUTH'])) :
$role = 'admin';
else :
$role = 'guest';
endif;
//檢查資源是否加入到acl object
if($acl->has($resource)) :
//如果使用者没有對該資源的權限,把使用者redirect
if(!$acl->isAllowed($role,$resource,$action)) :
switch($role) :
case 'admin':
$module = $this->_no_acl['module'];
$controller = $this->_no_acl['controller'];
$action = $this->_no_acl['action'];
break;
default:
$module = $this->_no_auth['module'];
$controller = $this->_no_auth['controller'];
$action = $this->_no_auth['action'];
break;
endswitch;
endif;
//設定redirect的module/controller/action
$request->setModuleName($module);
$request->setControllerName($controller);
$request->setActionName($action);
else :
//設定redirect的module/controller/action
if($role == 'admin') :
$module = $this->_no_acl['module'];
$controller = $this->_no_acl['controller'];
$action = $this->_no_acl['action'];
else :
$module = $this->_no_auth['module'];
$controller = $this->_no_auth['controller'];
$action = $this->_no_auth['action'];
endif;
$request->setModuleName($module);
$request->setControllerName($controller);
$request->setActionName($action);
endif;
}
}
?>
天創科技網頁設計公司