Listes de Contrôle d’Accès

Une Liste de Contrôle d’Accès (ACL - Access Control Lists) permet d’octroyer à un ou plusieurs utilisateurs l’accès à une entité ou à une annotation dans la base de données.

Créer une ACL

Une collection d’accès peut être créée en utilisant la fonction elgg_create_access_collection().

$owner_guid = elgg_get_logged_in_user_guid();

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

Sous-types d’ACL

Les ACLs peuvent avoir un sous-type, ceci permet de différencier différents usages de l’ACL. Il est fortement recommandé de définir un sous-type pour une ACL.

Le noyau de Elgg a trois exemples d’usage de sous-types

  • group_acl une ACL qui appartient à un ElggGroup qui donne aux membres du groupe l’accès aux contenus partagés dans le groupe

  • friends une ACL détenue par un ElggUser qui donne aux contacts de l’utilisateur l’accès aux contenus partagés avec les contacts

  • friends_collection une ACL qui appartient à un ElggUser qui donne à des contacts spécifiques l’accès aux contenus partagés avec cette ACL

Ajouter des membres à une ACL

Si vous avez une ACL vous devez encore lui ajouter des utilisateurs pour donner accès à ces utilisateurs au contenu avec l”access_id de l’ACL 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);

Retirer des membres d’une ACL

Si vous souhaitez ne plus donner l’accès à un utilisateur donné dans une ACL, vous pouvez facilement retirer cet utilisateur de la liste.

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

$acl->removeMember(user_guid_to_be_removed);

Récupérer une ACL

Afin de gérer une ACL, ou ajouter l’ID d’une ACL à une liste d’accès il existe plusieurs fonctions disponibles pour récupérer une ACL depuis la base de données.

// 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');

Accès en lecture

Le système d’accès de Elgg ajoute automatiquement toutes les ACL dont un utilisateur est membre aux contrôles d’accès. Par exemple, si un utilisateur est membre d’un groupe et est en contact avec 3 autres utilisateurs, toutes les ACL correspondantes sont ajoutées afin de vérifier l’accès aux entités lors de leur récupération (par exemple, la liste de tous les articles de blog).

Ignorer l’accès

Si dans certains cas vous avez besoin d’entités récupérées en ignorant les règles d’accès, vous pouvez envelopper votre code dans elgg_call. Il existe différents drapeaux que vous pouvez utiliser.

  • ELGG_IGNORE_ACCESS : aucune règle d’accès n’est appliquée

  • ELGG_ENFORCE_ACCESS : les règles d’accès sont forcées à être appliquées

  • ELGG_SHOW_DISABLED_ENTITIES : récupérera les entités désactivées

  • ELGG_HIDE_DISABLED_ENTITIES : ne récupérera jamais les entités désactivées

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

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

Vous pouvez également combiner des drapeaux.

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