2009-02-20 2 views
1

Мы имеем следующую структуру для примененияИзменения Родителя для ресурса - Zend ACL - 1.7.3

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.

Вся структура хранится как объект acl в базе данных mysql.

Когда-нибудь администраторы решили перенести поле2 из группы1 в группу2, как можно было бы сменить объект acl?

Я проверил файл Acl.php, но нет методов, в которых один изменяет родителя ресурса и тем самым автоматически обновляет правила/разрешения.

Спасибо.

Shashikant

ответ

1

Лично я предпочел бы не хранить сериализированный объект ACL в базе данных. Я предпочитаю хранить информацию о ролях, ресурсах и разрешениях непосредственно в таблицах базы данных и создавать новый объект ACL «на лету» при загрузке приложения.

Если вы действительно хотите сериализовать объект ACL в базе данных, вам может потребоваться удалить эти ресурсы для повторного добавления их в ACL. Код будет выглядеть примерно так, хотя я не кормили это в PHP интерпретатора:

$acl->remove('field2'); 
$acl->add(new Zend_Acl_Resource('field2'), 'group2'); 
+0

Я не уверен, что то, что предлагает cg, является хорошей идеей. Это фактически дублирование функциональности Zend_Acl в какой-то пользовательской системе, поэтому вы вообще не можете использовать Zend_Acl. Даже [Zend Documentation] [1] предлагает использовать сериализацию и хранение в базе данных или кеше, поэтому я думаю, что все в порядке. [1]: http://framework.zend.com/manual/en/zend.acl.advanced.html#zend.acl.advanced.storing –

0

Первый ответ ПОЧЕМУ на земле вы бы хранить эту логику доступа в базу данных ??? Это часть так называемой бизнес-логики, которая обычно принадлежит скрипту. База данных - это место для исходных исходных данных, например, тот факт, какой пользователь имеет какую роль. Я понимаю, что логическая часть кэширована, хотя для производительности.

Смежные вопросы