2014-09-07 4 views
1

мне нужен ACL для моего уровня приложений и я искал в Zend ACL который, кажется, чтобы покрыть свои потребности, но я смущен следующим [1]:Zend ACL и доступ к конкретным объектам

Например, если для каждого здания в стандартном правиле должно использоваться правило по умолчанию , можно просто назначить правилу город, а не , назначив одно и то же правило для каждого здания. Однако некоторые здания могут требовать от исключений из такого правила, и это может быть достигнуто в Zend\Permissions\Acl\Acl путем назначения таких правил исключения для каждого здания , требующего такого исключения.

Это замечательно. Именно то, что мне нужно. Однако как это сделать?

Из прочтения документации для Zend ACL я не могу на самом деле найти пример этого. Итак, скажем, у меня есть ресурс City и Building, и каждый из них реализует ResourceInterface. Что-то вроде этого:

class City implements ResourceInterface { 

    public function getResourceId() 
    { 
     return "city"; // Is this supposed to be the "type" or the "unique Id"? 
    } 

    public $buildings = array(); 

} 

class Building implements ResourceInterface { 

    public function getResourceId() 
    { 
     return "building"; // Again, the "type" or "unique Id"? 
    } 

} 

Поскольку комментарии в приведенном выше коде могут уже прояснить, что такое идентификатор ресурса? представляет ли он «тип» ресурса, т. е. это город или здание, или ему требуется быть уникальным идентификатором, то есть «городом-1» и т. д.?

Если ответ заключается в том, что он должен быть «типом», тогда возникает вопрос; как указать уникальные здания? Однако, если ответ заключается в том, что идентификатор должен быть уникальным, тогда возникает вопрос; как я идентифицирую «тип» ресурса и «общее» разрешение каждого здания, как указано в цитате, взятой из документации.

Любое понимание было бы высоко оценено.

[1] http://zf2.readthedocs.org/en/latest/modules/zend.permissions.acl.intro.html

+0

может быть, это может помочь: http://stackoverflow.com/questions/11668785/zend-acl-dynamic-assertion это есть пример. –

ответ

2

в resource Id должно быть уникальным значением. и для назначения глобальных правил вам нужно использовать наследование для ресурсов. просто вам нужно передать ресурс city в качестве родителя для ресурса building при добавлении ресурсов в acl.

вот пример:

$acl = new Acl(); 

//the original Acl resource class takes a `resourceId` as constructor parameter 
$mycity1 = new Resource('mycity1'); 
$acl->addResource($mycity1); 

$mybuiding1 = new Resource('mybulding1'); 
//city is the buildings parent 
$acl->addResource($mybuiding1,$mycity1); 

//you dont even have to create a class just define the resource as string 
$acl->addResource('secure_buildings',$mycity1); 

$acl->addRole('myrole1'); 
//roles have inheritance too 
$acl->addRole('myrole2','myrole1'); 

//myrole1 and myrole2 has access to city and all its building 
$acl->allow('myrole1','mycity1'); 
//myrole2 has access to city and all its building except 'secure_buildings' 
$acl->deny('myrole2','secure_buildings'); 

ребенок наследует ресурс bulding правила из родительского city, если ни один не определен для него.

UPDATE для комментариев:

ACL не знает и не заботится, какой тип ресурса вы имеете до тех пор, как они имеют уникальные идентификаторы ресурсов, ПКС угрозы все ресурсы, как равно и выглядит только для resourceId и наследования.

при определении правил вам нужно только обеспечить resourceId для allow и deny, это не имеет значения, какой тип они до тех пор, как они определены в качестве ресурса и добавляется в стек списка ACL.

и когда вы делаете $acl->inAllowed вам нужно только roleId и resourceId и снова аКЛ не заботится о своем типе, только то, что они были определены как ресурс абд, что они имеют родителей или нет ...

Пример: я надеюсь, что это достаточно Sample

$acl = new Acl(); 
$acl->addResource('City'); //all the cities 
$acl->addResource('myCity1', 'City'); //city1 inherits City 
$acl->addResource('Building', 'City'); //all the buildings in all the cities 
$acl->addResource('normal_buildings', 'Building'); 
$acl->addResource('secure_buildings', 'Building'); 
$acl->addResource('top_secure_buildings', 'secure_buildings'); 

$acl->addRole('Civilian'); 
$acl->addRole('High_Level_Security', 'Civilian'); 

$acl->allow('Civilian', 'City'); 
$acl->deny('Civilian', 'secure_buildings'); 

$acl->allow('High_Level_Security', 'secure_buildings'); 
$acl->deny('High_Level_Security', 'top_secure_buildings'); 

var_dump($acl->isAllowed('Civilian', 'City'));//true -> direct allow rule 
var_dump($acl->isAllowed('Civilian', 'myCity1'));//true -> inherited from City allow rule 
var_dump($acl->isAllowed('Civilian', 'Building'));//true -> inherited from City allow rule 
var_dump($acl->isAllowed('Civilian', 'normal_buildings'));//true -> inherited from City allow rule 
var_dump($acl->isAllowed('Civilian', 'secure_buildings'));//false -> direct deny rule 
var_dump($acl->isAllowed('Civilian', 'top_secure_buildings'));//false -> inherited from secure_building deny rule 

var_dump($acl->isAllowed('High_Level_Security', 'City'));//true -> inherited from Civilian->City allow rule 
var_dump($acl->isAllowed('High_Level_Security', 'myCity1'));//true -> inherited from Civilian->City allow rule 
var_dump($acl->isAllowed('High_Level_Security', 'Building'));//true -> inherited from Civilian->City allow rule 
var_dump($acl->isAllowed('High_Level_Security', 'normal_buildings'));//true -> inherited from Civilian->City allow rule 
var_dump($acl->isAllowed('High_Level_Security', 'secure_buildings'));//true -> direct allow rule 
var_dump($acl->isAllowed('High_Level_Security', 'top_secure_buildings'));//false -> direct deny rule 
+0

обновил ответ с помощью примера, и вы понимаете, что Zend в open source и вы можете проверить исходный код, чтобы понять, что происходит? правильно ? если вы проверите код, вы увидите, что acl не дает **** какой тип ресурса, и если ресурс не имеет прямого правила, он проверяет родителя и так далее ... – Exlord

+0

Ваше последнее обновление имеет полный смысл сейчас , Спасибо за вашу помощь. – Luke

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

  • Нет связанных вопросов^_^