Списки контроля доступа

Список контроля доступа (ACL) может предоставлять одному или нескольким пользователям доступ к сущности или аннотации в базе данных.

Создание списка контроля доступа

Список контроля доступа можно создать с помощью функции elgg_create_access_collection().

$owner_guid = elgg_get_logged_in_user_guid();

$acl = elgg_create_access_collection("Sample name", $owner_guid, 'collection_subtype');

Подтипы списков контроля доступа

Списки контроля доступа могут иметь подтип, который помогает различать способы использования списка. Настоятельно рекомендуется устанавливать подтип для списка контроля доступа.

В ядре Elgg есть три примера использования подтипов

  • group_acl — список контроля доступа, принадлежащий ElggGroup, который предоставляет участникам группы доступ к контенту, общему для группы

  • friends — список контроля доступа, принадлежащий ElggUser, который предоставляет друзьям пользователя доступ к контенту, общему для друзей

  • friends_collection — список контроля доступа, принадлежащий ElggUser, который предоставляет определённым друзьям доступ к контенту, общему для списка

Добавление пользователей в список контроля доступа

Если у вас есть список контроля доступа, вам всё равно нужно добавить в него пользователей, чтобы предоставить им доступ к контенту с access_id, равным id списка.

// creating an ACL
$owner_guid = elgg_get_logged_in_user_guid();

/* @var $acl ElggAccessCollection */
$acl = elgg_create_access_collection("Sample name", $owner_guid, 'collection_subtype');

// add user
$acl->addMember($some_other_user_guid);

Удаление пользователей из списка контроля доступа

Если вы больше не хотите предоставлять доступ определённому пользователю в списке контроля доступа, вы можете легко удалить этого пользователя из списка.

// remove a user from an ACL
/* @var $acl ElggAccessCollection */
$acl = elgg_get_access_collection($acl_id);

$acl->removeMember(user_guid_to_be_removed);

Получение списка контроля доступа

Для управления списком контроля доступа или добавления его ID в список доступа существуют несколько функций для получения списка из базы данных.

// get ACL based on known id
$acl = elgg_get_access_collection($acl_id);

// get all ACLs of an owner (procedural style)
$acls = elgg_get_access_collections([
        'owner_guid' => $some_owner_guid,
]);

// get all ACLs of an owner (object oriented style)
$acls = $some_owner_entity->getOwnedAccessCollections();

// add a filter for ACL subtype
// get all ACLs of an owner (procedural style)
$acls = elgg_get_access_collections([
        'owner_guid' => $some_owner_guid,
        'subtype' => 'some_subtype',
]);

// get all ACLs of an owner (object oriented style)
$acls = $some_owner_entity->getOwnedAccessCollections([
        'subtype' => 'some_subtype',
]);

// get one ACL of an owner (object oriented style)
// for example the group_acl of an ElggGroup
// Returns the first ACL owned by the entity with a given subtype
$acl = $group_entity->getOwnedAccessCollection('group_acl');

Доступ на чтение

Система доступа Elgg автоматически добавляет все списки контроля доступа, участником которых является пользователь, к проверкам доступа. Например, если пользователь является участником группы и дружит с 3 другими пользователями, все соответствующие списки добавляются для проверки доступа к сущностям при их получении (например, при выводе списка всех блогов).

Игнорирование доступа

Если в каком-либо случае вам нужно получить сущности, игнорируя правила доступа, вы можете обернуть ваш код в elgg_call. Существуют различные флаги, которые можно использовать.

  • ELGG_IGNORE_ACCESS: правила доступа не применяются

  • ELGG_ENFORCE_ACCESS: правила доступа принудительно применяются

  • ELGG_SHOW_DISABLED_ENTITIES: будут получены отключённые сущности

  • ELGG_HIDE_DISABLED_ENTITIES: отключённые сущности никогда не будут получены

$options = [
        'type' => 'user'
];

$entities = elgg_call(ELGG_IGNORE_ACCESS, function() use ($options) {
        return elgg_get_entities($options);
});

Вы также можете комбинировать флаги.

$entities = elgg_call(ELGG_IGNORE_ACCESS | ELGG_SHOW_DISABLED_ENTITIES, function() {
        return elgg_get_entities([
                'type' => 'user'
        ]);
});