2014-10-13 4 views
3

Я использую Symfony добавления, и я заметил, что когда класс ACL создан для первого раза, acl_object_identities также создается с object_identifier = классомSymfony 2 Acls insertClassAces

Но если вставить туз class, (acl_entries), object_identity_id установлен в NULL. Интересно, почему ранее не созданная acl_object_identity не используется?

стол acl_class: 6 XXXXXXXX/MyClass

таблица acl_object_identities 63 NULL, 6 класс 1

таблица acl_entries 199 6 NULL, NULL 1 3 1073741823 1 все 0 0

should'nt быть это ? 199 6 63 1 NULL 3 1073741823 1 все 0 0

Я не понимаю, почему класс объектной идентичности создан и не используется с записями классов.

Это мой код, может быть, есть что-то не так:

//find or create acl 
$classIdentity = new ObjectIdentity('class', ClassUtils::getRealClass($class)); 
$aclProvider = $this->getService('security.acl.provider'); 
try { 
     $acl = $aclProvider->findAcl($classIdentity); 
    } catch (AclNotFoundException $e) { 
     $acl = $aclProvider->createAcl($classIdentity); 
    } 

//insert class aces 
$maskBuilder = new MaskBuilder(128); 
$securityId = new RoleSecurityIdentity('ROLE_ADMIN'); 
$acl->insertClassAce($securityId, $maskBuilder->get()); 
$aclProvider->updateAcl($acl); 

Благодаря

ответ

1

Я надеюсь, что я правильно прочитал ваш вопрос.

Таблица acl_object_identities содержит только что: идентификационные данные объекта. Даже когда вы создаете ACE, основанный на классе, вы должны предоставить действительный идентификатор объекта, и вы делаете это, используя «фиктивный» идентификатор с именем class. Теоретически это могло быть что угодно, кроме NULL или пустой строки. Использование class является общим соглашением в этих случаях).

Помните, что ACL могут теоретически иметь сочетание объектов ACE и глобальных ACE объектов (даже с полями или без них). Без идентификатора объекта (фиктивного), присутствующего в таблице acl_object_identities, вы не можете использовать ACL напрямую, например, для обновления, удаления.

Еще одна причина, почему вы хотели бы получить доступ к такой ACL напрямую при проверке разрешений, когда нет настоящего объектов:

$objectIdentity = new ObjectIdentity('class', 'The\Namespaced\Class'); 
if ($context->isGranted('CREATE', $objectIdentity)) { 
    ... // seems you are allowed to create objects of this class 
} 

Это пригодится, чтобы проверить против «глобальных» CREATE разрешений для класс.

Таблица acl_entries состоит из всех ACE, как объектов, так и объектов ACE класса. Когда для объекта object_identity_id установлено значение NULL, запись представляет собой ACE с классом, в противном случае это ACE с объектной областью. ACE класса-класса нужно только знать, какой класс используется, и на самом деле не волнует идентификаторы объектов, поэтому это поле может быть пустым. Поле class_id используется в этих случаях для определения типа класса.

Теоретически они могли бы удалили class_id колонки из acl_entries и всегда используются object_identity_id вместо этого, потому что таблица также имеет связь с class_id. Однако для этого потребуется дополнительное соединение, и нам все равно нужно добавить где-то в ace_table, является ли запись ACE класса или ACE-области.

Имейте в виду, что многое из ACL написано по причинам эффективности и скорости, что иногда ухудшает удобочитаемость.