1

我们的应用程序有以下结构

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');

这表示大学申请的数据库,组/字段是大学申请的组成部分。从上述情况来看,申请人确实具有编辑字段2的编辑权限。

整个结构存储为 mysql 数据库中的 acl 对象。

在管理员决定将 field2 从 group1 移动到 group2 之后,如何更改 acl 对象?

我检查了 Acl.php 文件,但没有任何方法可以更改资源的父级,从而自动更新规则/权限。

谢谢。

沙什康特

4

2 回答 2

1

就个人而言,我不希望将序列化的 ACL 对象存储在数据库中。我宁愿将有关角色、资源和权限的信息直接存储在数据库表中,并在引导应用程序时动态创建一个新的 ACL 对象。

如果您确实想将 ACL 对象序列化到数据库,则删除有问题的资源并将它们重新添加到 ACL 可能对您有用。代码看起来像这样,尽管我没有将它提供给 PHP 解释器:

$acl->remove('field2');
$acl->add(new Zend_Acl_Resource('field2'), 'group2');
于 2009-02-20T16:25:12.497 回答
0

第一个答案为什么你会在数据库中存储这个访问逻辑???它是所谓业务逻辑的一部分,通常属于脚本。数据库是存放原始源数据的地方,就像事实一样,哪个用户有哪个角色。我理解为了性能而缓存了逻辑部分。

于 2011-03-02T13:30:01.613 回答