我们的应用程序有以下结构
require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();
$acl = new Zend_Acl();
// application
$acl->add(new Zend_Acl_Resource('application1'));
// groups
$acl->add(new Zend_Acl_Resource('group1'), 'application1');
$acl->add(new Zend_Acl_Resource('group2'), 'application1');
// fields
$acl->add(new Zend_Acl_Resource('field1'), 'group1');
$acl->add(new Zend_Acl_Resource('field2'), 'group1');
$acl->add(new Zend_Acl_Resource('field3'), 'group2');
$acl->add(new Zend_Acl_Resource('field4'), 'application1');
// roles
$acl->addRole(new Zend_Acl_Role('applicant'));
$acl->addRole(new Zend_Acl_Role('admin'), 'applicant');
// permissions
$acl->allow('applicant', 'application1', 'view');
$acl->allow('applicant', 'group1', 'edit');
这代表大学应用程序的数据库,组/字段是大学申请的组成部分。从上面可以看出申请人具有编辑field2的编辑权限。
整个结构作为acl对象存储在mysql数据库中。
有些时候管理员决定将field2从group1移到group2,怎么会改变acl对象?
我检查了文件Acl.php,但是没有方法可以更改资源的父级,从而自动更新规则/权限。
感谢。
Shashikant
答案 0 :(得分:1)
就个人而言,我宁愿不将序列化的ACL对象存储在数据库中。我宁愿直接在数据库表中存储有关角色,资源和权限的信息,并在引导应用程序时动态创建新的ACL对象。
如果您确实要将ACL对象序列化到数据库,则可能需要删除有问题的资源并将其重新添加到ACL。代码看起来像这样,虽然我还没有将它提供给PHP解释器:
$acl->remove('field2');
$acl->add(new Zend_Acl_Resource('field2'), 'group2');
答案 1 :(得分:0)
首先回答为什么你要将这个访问逻辑存储在数据库中?它是所谓的业务逻辑的一部分,通常属于脚本。数据库是原始源数据的一个位置,就像事实一样,哪个用户具有哪个角色。 为了提高性能,我理解为了缓存逻辑部分。