大神指定的第一个任务,自学ZF框架中的Permissions~!
http://zendframework2.sinaapp.com/blog/579
几点细节问题:
1.多继承的时候是从父角色数组的最后一个角色开始继承,这与C++中的继承顺序刚好相反。
EX:
$parents = array('guest', 'member', 'admin');
$acl->addRole(new Role('someUser'), $parents);
someUser是先继承admin,再继承member,最后继承guest
C++ 中 若 Class someUser: guest, member, admin 则先执行guest的构造函数。
2.模糊条件,既然可以多继承,那么就会产生父角色之间的矛盾的情况。面对这种情况,则按照1.的访问顺序来查询规则。
3.$acl->allow(‘role’,‘resource’,'privilege')
而 $acl->allow('administrator') =>> $acl->allow('administrator', null,null) ; 代表adminstrator拥有所有权利去访问所有资源。
“ NULL 值来示意应用对所有角色,所有资源,和/或特权 ”
Q:NULL什么时候可以缺省,什么时候不行:
猜想:
4.$acl->removeDeny(‘role’,‘resource’,'privilege'); 移除pivilege
5.storing ACL Data for Persistence
用serialize() 来序列号ACL数据,然后存储到任何地方
serialize()用法:http://php.net/manual/zh/function.serialize.php
6.writing conditional acl rulues with assertions
通过 implements
Zend\Permissions\Acl\Assertion\AssertionInterface 构造所需条件的函数,然后加到allow()中达到实现条件性赋值~~
类似大一实训中利用C++ 11特性,传递函数来扩展功能。
用法:
class CleanIPAssertion implements Zend\Permissions\Acl\Assertion\AssertionInterface { public function assert(Zend\Permissions\Acl\Acl $acl, Zend\Permissions\Acl\Role\RoleInterface $role = null, Zend\Permissions\Acl\Resource\ResourceInterface $resource = null, $privilege = null) { return $this->_isCleanIP($_SERVER['REMOTE_ADDR']); } protected function _isCleanIP($ip) { // ...在这里实现逻辑返回bool值,只有为true是,下面的allow才可以生效。} }use Zend\Permissions\Acl\Acl; $acl = new Acl(); $acl->allow(null, null, null, new CleanIPAssertion());
;-------------------------------------------------------------------
断言对象的 assert() 被传给授权查询(例如,isAllowed())适用的 ACL,角色,资源,和特权,以便为断言类提供一个上下文来判断哪里需要它的条件。
不太清楚怎么用assert(),希望有人可以给个实例。是应该new CleanIPAsserion()后,用CleanIPAssertion->set(v1,v2,v3,v4)??
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------