Permission et propriété dans Icybee

Les actions que peut accomplir un utilisateur sur un site administré par Icybee sont dictées par les permissions qui lui sont accordées, et parfois le fait qu'il est le propriétaire ou non d'un enregistrement.

Deux méthodes permettent de déterminer si un utilisateur a une permission spécifique, ou s'il est le propriétaire d'un enregistrement. Afin de répondre au mieux aux nombreuses situations un système ouvert est utilisé pour alimenter ses méthodes et étendre leurs capacités de détermination.

Déterminer la permission d'un utilisateur

La méthode has_permission() détermine si un utilisateur a une certaine permission. Cette permission peut être relative à une cible, un module par exemple.

L'exemple suivant démontre comment vérifier si l'utilisateur peut mettre à jour son profil, ou s'il a la permission d'administrer le module Users.

<?php

use ICanBoogie\Module;

if ($user->has_permission('update own profile')
|| $user->has_permission(Module::PERMISSION_ADMINISTER, $core->modules['users']))
{
    // …
}

Déterminer la propriété d'un utilisateur

La métode has_ownership() détermine si un utilisateur est le propriétaire d'un enregistrement. Attention, « propriété » n'implique pas « permission » ! Un utilisateur peut être le propriétaire d'un enregistrement sans pour autant avoir la permission de le supprimer.

L'exemple suivant démontre comment vérifier si un utilisateur est le propriétaire d'un nœud de contenu.

<?php

$node = $core->models['nodes']->one;

if ($user->has_ownership($node))
{
    // …
}

Un système ouvert

Afin de répondre au mieux aux nombreuses situations, un système ouvert, basé sur le concept de plugin, est utilisé. Grâce à ce système, un module tiers pourrait apporter le support du partage de propriété qui n'est pas supporté par le module Users. C'est comme cela que le module Roles apporte le support des permissions liées à des rôles.

Les résolveurs sont définis en utilisant la configuration « users ».

Les résolveurs de permission

Les résolveurs de permission permettent de déterminer si un utilisateur a la permission nécessaire pour accomplir une action. Par exemple, le résolveur défini par le module Roles détermine la permission d'un utilisateur en fonction des rôles et des permissions qui lui sont associés.

Les résolveurs de permission se définissent dans le tableau permission_resolver_list de la configuration « users ». Il peut s'agir d'une fonction ou du nom d'une classe implementant l'interface PermissionResolverInterface.

<?php

// …/config/users.php

return [

    'permission_resolver_list' => [

        'a_resolver' => 'Hooks::my_permission_resolver',
        'another_resolver' => 'MyPermissionResolverClass'

    ]

];

Résolveurs de propriété

Les résolveurs de propriété permettent de déterminer si un utilisateur est le propriétaire d'un enregistrement. Le résolveur défini par le module users considère qu'un utilisateur est le propriétaire d'un enregistrement si cet enregistrement a la propriété uid et qu'elle correspond à l'identifiant de l'utilisateur. Le code du résolveur ressemble à cela :

<?php

namespace Icybee\Modules\Users;

use ICanBoogie\ActiveRecord;

function(User $user, ActiveRecord $record)
{
    if (isset($record->uid) && $record->uid == $user->uid)
    {
        return true;
    }
}

Les résolveurs de propriété se définissent dans le tableau ownership_resolver_list de la configuration « users ». Il peut s'agir d'une fonction ou du nom d'une classe implementant l'interface OwnershipResolverInterface.

<?php

// …/config/users.php

return [

    'ownership_resolver_list' => [

        'a_resolver' => 'my_ownership_resolver',
        'another_resolver' => 'MyOwnershipResolverClass'

    ]

];

Poids des résolveurs

Il est possible d'attribuer un poids à un résolveur grâce à la clé weight. Le poids peut être une valeur numérique comme 10 ou -10, ou un poids relatif à un autre résolveur comme before:<resolver_id> ou after:<resolver_id>, où <resolver_id> est l'identifiant d'un autre résolveur.

<?php

// users.roles/config/users.php

namespace Icybee\Modules\Users\Roles;

return [

    'permission_resolver_list' => [

        'roles' => [ __NAMESPACE__ . '\PermissionResolver''weight' => 0 ]

    ],

    'ownership_resolver_list' => [

        'roles' => [ __NAMESPACE__ . '\OwnershipResolver''weight' => 10 ]

    ]

];

Le poids de -10 permet au résolveur de permission mymodule de passer devant celui de roles. Le poids relatif before:roles place le résolveur de propriété mymodule juste devant celui de roles.

<?php

// mymodule/config/users.php

namespace Website\MyModule;

return [

    'permission_resolver_list' => [

        'mymodule' => [ __NAMESPACE__ . '\PermissionResolver''weight' => -10 ]

    ],

    'ownership_resolver_list' => [

        'mymodule' => [ __NAMESPACE__ . '\OwnershipResolver''weight' => 'before:roles' ]

    ]

];

Appel aux résolveurs

Afin de déterminer si un utilisateur a une permission spécifique, les résolveurs de permission sont parcourus un a un. Avant de parcourir les résolveurs, la valeur de la permission vaut false, cette valeur est modifiée si le résolveur renvoi autre chose que null. Généralement les résolveurs ne renvoient que true s'ils accordent la permission, et null dans le cas contraire. En effet, un résolveur ne renvoie false que s'il souhaite écraser la réponse d'un précédent résolveur.

Il en va de même pour déterminer si un utilisateur est le propriétaire d'un enregistrement.

Conclusion

Les méthodes has_permission() et has_ownership() permettent de déterminer si un utilisateur a une permission spécifique, ou s'il est le propriétaire d'un enregistrement. Des résolveurs peuvent être ajoutés pour étendre les capacités de détermination du système.

Laisser un commentaire

Pas de commentaire