gpt4 book ai didi

zend-framework - Zend 框架 : need typical example of ACL

转载 作者:行者123 更新时间:2023-12-02 13:33:17 28 4
gpt4 key购买 nike

有人可以指导我 ACL 的典型实现示例吗?就像“管理员”可以访问“管理”模块,“用户”可以访问“用户模块”,访客可以访问“打开”页面。

最佳答案

我可以将我的 ACL 粘贴给您。它由三个元素组成:acl.ini、ACL Controller 插件 (My_Controller_Plugin_Acl) 和 My_Acl 类以及 USER 表。然而,它不处理模块,而是处理 Controller 和操作。不过,它可能会让您对 ACL 有一些总体了解。我对 ACL 的使用基于一本名为“Zend Framework in Action”的书中的内容。

USER表(权限字段用于ACL):

CREATE  TABLE IF NOT EXISTS `USER` (
`user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`email` VARCHAR(85) NOT NULL ,
`password` CHAR(32) NOT NULL,
`phone` VARCHAR(45) NULL ,
`phone_public` TINYINT(1) NULL DEFAULT 0 ,
`first_name` VARCHAR(45) NULL ,
`last_name` VARCHAR(45) NULL ,
`last_name_public` TINYINT(1) NULL DEFAULT 1 ,
`is_enabled` TINYINT(1) NOT NULL DEFAULT 1 ,
`created` TIMESTAMP NOT NULL,
`privilage` ENUM('BASIC','PREMIUM','ADMIN') NOT NULL DEFAULT 'BASIC' ,
PRIMARY KEY (`user_id`) ,
UNIQUE INDEX `email_UNIQUE` (`email` ASC) )
ENGINE = InnoDB;

acl.ini(我有四种权限,例如基本权限继承 guest 权限,高级权限继承基本权限,高级权限继承管理员权限):

; roles
acl.roles.guest = null
acl.roles.basic = guest
acl.roles.premium = basic
acl.roles.administrator = premium

; resources
acl.resources.deny.all.all = guest


acl.resources.allow.index.all = guest
acl.resources.allow.error.all = guest
acl.resources.allow.user.login = guest
acl.resources.allow.user.logout = guest
acl.resources.allow.user.create = guest

acl.resources.allow.user.index = basic
acl.resources.allow.user.success = basic

My_Acl class(根据ini文件创建ACL角色和资源):

class My_Acl extends Zend_Acl {

public function __construct() {
$aclConfig = Zend_Registry::get('acl');
$roles = $aclConfig->acl->roles;
$resources = $aclConfig->acl->resources;
$this->_addRoles($roles);
$this->_addResources($resources);
}

protected function _addRoles($roles) {

foreach ($roles as $name => $parents) {
if (!$this->hasRole($name)) {
if (empty($parents)) {
$parents = null;
} else {
$parents = explode(',', $parents);
}
$this->addRole(new Zend_Acl_Role($name), $parents);
}
}
}

protected function _addResources($resources) {

foreach ($resources as $permissions => $controllers) {

foreach ($controllers as $controller => $actions) {
if ($controller == 'all') {
$controller = null;
} else {
if (!$this->has($controller)) {
$this->add(new Zend_Acl_Resource($controller));
}
}

foreach ($actions as $action => $role) {
if ($action == 'all') {
$action = null;
}
if ($permissions == 'allow') {
$this->allow($role, $controller, $action);
}
if ($permissions == 'deny') {
$this->deny($role, $controller, $action);
}
}
}
}
}

}

My_Controller_Plugin_Acl:

class My_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract {

/**
*
* @var Zend_Auth
*/
protected $_auth;

protected $_acl;
protected $_action;
protected $_controller;
protected $_currentRole;

public function __construct(Zend_Acl $acl, array $options = array()) {
$this->_auth = Zend_Auth::getInstance();
$this->_acl = $acl;

}

public function preDispatch(Zend_Controller_Request_Abstract $request) {

$this->_init($request);

// if the current user role is not allowed to do something
if (!$this->_acl->isAllowed($this->_currentRole, $this->_controller, $this->_action)) {

if ('guest' == $this->_currentRole) {
$request->setControllerName('user');
$request->setActionName('login');
} else {
$request->setControllerName('error');
$request->setActionName('noauth');
}
}
}

protected function _init($request) {
$this->_action = $request->getActionName();
$this->_controller = $request->getControllerName();
$this->_currentRole = $this->_getCurrentUserRole();
}

protected function _getCurrentUserRole() {

if ($this->_auth->hasIdentity()) {
$authData = $this->_auth->getIdentity();
$role = isset($authData->property->privilage)?strtolower($authData->property->privilage): 'guest';
} else {
$role = 'guest';
}

return $role;
}

}

最后是 Bootstrap.php 的一部分,其中所有内容都已初始化:

protected function _initLoadAclIni() {
$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/acl.ini');
Zend_Registry::set('acl', $config);
}

protected function _initAclControllerPlugin() {
$this->bootstrap('frontcontroller');
$this->bootstrap('loadAclIni');

$front = Zend_Controller_Front::getInstance();

$aclPlugin = new My_Controller_Plugin_Acl(new My_Acl());

$front->registerPlugin($aclPlugin);
}

关于zend-framework - Zend 框架 : need typical example of ACL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5209671/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com