Attention : vous consultez actuellement la documentation dédiée aux versions 1.x de Moodle. La documentation pour les versions 2.x de Moodle est consultable ici : Comment les permissions sont calculées ?, celle pour les versions 3.x de Moodle est consultable ici : Comment les permissions sont calculées ? et celle pour Moodle 4.x est consultable là : Comment les permissions sont calculées ?.

« Comment les permissions sont calculées ? » : différence entre les versions

De MoodleDocs
Aller à :navigation, rechercher
(Suite de la traduction)
(Suite de la traduction (2))
Ligne 34 : Ligne 34 :
Le module test fera appel à la fonction ''has_capability'' pour voir s'il doit permettre à l'utilisateur d'effectuer cette action.
Le module test fera appel à la fonction ''has_capability'' pour voir s'il doit permettre à l'utilisateur d'effectuer cette action.


The function considers the following permissions data:
La fonction considère les données de permissions suivantes :


* ''Role definitions'' (these are in the System context)  
* la ''définition des rôles'' (situées dans le contexte Système),
* ''Role assignments'' which have been made in any of the five contexts
* les ''attributions de rôles'' qui ont été effectuées dans n'importe lequel des cinq contextes concernés,
* ''Role overrides'' which may occur in any of the contexts except System (there is no concept of override in System).   
* les ''dérogations aux rôles'' ayant été définies dans n'importe lequel des contextes, sauf le contexte Système (il n'y a pas de dérogation de rôles possible dans le contexte Système).   


Note that there may be multiple assignments and/or overrides in any single context.   
Il est à remarquer qu'il peut y avoir plusieurs rôles attribués et/ou plusieurs dérogations définies dans un seul contexte.   


Whether or not the user can attempt the quiz is a function of the data, as well as the location of the data in the context chain.
La permision pour l'utilisateur de tenter le test ou non dépend des données ci-dessus, ainsi que de l'emplacement de ces données dans la chaîne des contextes.


The function ignores any data that isn't used in the computation. It ignores
La fonction ignore toutes les données n'étant pas utilisées dans le calcul des permissions. Elle ignore notamment :


* roles that aren't assigned to the user
* les rôles qui ne sont pas attribués à l'utilisateur,
* capabilities other than one we're testing
* les capacités autres que celles que nous testons et
* permissions that are Not set.   
* les permissions qui ne sont pas définies.   


After ignoring the above data, we are left with a very simple "data slice" consisting of just those permissions for the capability we're testing, in which all values are either Allow (A), Prevent (P), or Prohibit (X). This data can be represented in a neat tabular form, resembling an addition problem. For our quiz example, suppose we have
Après avoir ignoré ces données, il nous reste une très simple "tranche de données" consistant uniquement des permissions liées à la capacité que nous testons, et pour lesquelles les valeurs sont soit Autoriser (A), Empêcher (P), ou Interdire (X). Ces données peuvent être représentées sous la forme d'un joli tableau, ressemblant à une simple addition en colonne. Dans l'exemple de notre test, admettons que nous ayons le tableau


     P  A  P
     P  A  P
Ligne 60 : Ligne 60 :
       ?     
       ?     


The top row represents the permissions in the role definitions, one permission from each role. In the example, you can see that the user is currently assigned three roles. The remaining rows represent the overrides. In the example, you can see that the user has
La première rangée représente les permissions indiquées dans les définitions des rôles, une permission pour chacun des rôles que possède l'utilisateur. Dans notre exemple, on observe que trois rôles sont attribués à l'utilisateur. Les rangées suivantes représentent les dérogations. Dans l'exemple, on observe que l'utilisateur


* one override in category A,  
* une dérogation dans la catégorie A,  
* three overrides in the category B
* trois dérogations dans la catégorie B,
* two overrides the course
* deux dérogations dans le cours et
* two overrides in the quiz itself.   
* deux dérogations dans le test proprement dit.   


When representing a complex example like this, it is convenient to line up the override permissions under the role that's being overridden, but it is not necessary to do so because we don't "add" permissions in columns the way we add numbers.
When representing a complex example like this, it is convenient to line up the override permissions under the role that's being overridden, but it is not necessary to do so because we don't "add" permissions in columns the way we add numbers.

Version du 26 février 2008 à 21:07

Remarque : la traduction de cet article n'est pas terminée. N'hésitez pas à traduire tout ou partie de cette page ou à la compléter. Vous pouvez aussi utiliser la page de discussion pour vos recommandations et suggestions d'améliorations.


Une des questions posées très fréquemment est : Quelles permissions possède un utilisateur pour un contexte donné ?

Cette page explique la fonction principale de Moodle utilisée pour répondre à cette question. Cette fonction est has_capability(). Elle se trouve dans le fichier lib/accesslib.php. Cette fonction implémente les règles pour calculer la "somme" des permissions de multiples rôles et dérogations. Pour un utilisateur donné, une capacité, et un contexte, la fonction renvoi true (vrai) si l'utilisateur est autorisé à effectuer l'action contrôlée par la capacité dans le contexte donné, et false (faux) sinon.

Cette page est écrite autant pour les non programmeurs que pour les programmeurs. Elle décrit ce que la fonction fait, pas comment. Le comment est compliqué, alors que le quoi est relativement simple !

Remarquez que la fonction n'essaie pas de répondre à la grande question posée dans la première phrase de cette page. Elle répond plutôt à la petite question "Un utilisateur peut-il faire CAP ici ?", où CAP est une capacité spécifique. Moodle ne calcule jamais la totalité des permissions d'un utilisateur. Une telle opération serait très coûteuse et et n'apporterait pas grand chose, puisque la plupart des permissions ne seraient jamais testées. Moodle calcule donc les permissions à la demande. Moodle ne place pas en cache les permissions calculées, mais les recalcule chaque fois qu'il est nécessaire de les tester. C'est la raison pour laquelle les attributions de rôles et les dérogations prennent effet immédiatement, et que ce n'était pas le cas dans Moodle 1.7.

La fonction est appelée ainsi :

   has_capability(CAPABILITY,CONTEXT,USER);

Elle retourne un résultat vrai/faux :

  • true signifie que l'utilisateur est autorisé à effectuer l'action
  • false signifie que l'utilisateur n'est pas autorisé à effectuer l'action

Le CONTEXT peut être le contexte Système ou tout autre contexte imbriqué de façon arbitraire dans le contexte Système. À l'interne, la fonction utilise une notation analogue à celle des chemins d'accès des fichiers Unix pour représenter les contextes (par exemple, /1/3/4/150). De tels détails ne sont pas nécessaires dans cette discussion.

Supposons qu'un utilisateur soit sur le point de tenter un test (capacité mod/quiz:attempt) dans le contexte d'un module imbriqué quatre niveaux au-dessous du contexte Système.

     Système
        |
    Catégorie A
        |					      
   Sous-catégorie B
        |
      Cours
        |
       Test  <--- l'utilisateur est ici

Le module test fera appel à la fonction has_capability pour voir s'il doit permettre à l'utilisateur d'effectuer cette action.

La fonction considère les données de permissions suivantes :

  • la définition des rôles (situées dans le contexte Système),
  • les attributions de rôles qui ont été effectuées dans n'importe lequel des cinq contextes concernés,
  • les dérogations aux rôles ayant été définies dans n'importe lequel des contextes, sauf le contexte Système (il n'y a pas de dérogation de rôles possible dans le contexte Système).

Il est à remarquer qu'il peut y avoir plusieurs rôles attribués et/ou plusieurs dérogations définies dans un seul contexte.

La permision pour l'utilisateur de tenter le test ou non dépend des données ci-dessus, ainsi que de l'emplacement de ces données dans la chaîne des contextes.

La fonction ignore toutes les données n'étant pas utilisées dans le calcul des permissions. Elle ignore notamment :

  • les rôles qui ne sont pas attribués à l'utilisateur,
  • les capacités autres que celles que nous testons et
  • les permissions qui ne sont pas définies.

Après avoir ignoré ces données, il nous reste une très simple "tranche de données" consistant uniquement des permissions liées à la capacité que nous testons, et pour lesquelles les valeurs sont soit Autoriser (A), Empêcher (P), ou Interdire (X). Ces données peuvent être représentées sous la forme d'un joli tableau, ressemblant à une simple addition en colonne. Dans l'exemple de notre test, admettons que nous ayons le tableau

   P  A  P
         A
   P  A  X
   A     P
      P  A
   --------
      ?    

La première rangée représente les permissions indiquées dans les définitions des rôles, une permission pour chacun des rôles que possède l'utilisateur. Dans notre exemple, on observe que trois rôles sont attribués à l'utilisateur. Les rangées suivantes représentent les dérogations. Dans l'exemple, on observe que l'utilisateur

  • une dérogation dans la catégorie A,
  • trois dérogations dans la catégorie B,
  • deux dérogations dans le cours et
  • deux dérogations dans le test proprement dit.

When representing a complex example like this, it is convenient to line up the override permissions under the role that's being overridden, but it is not necessary to do so because we don't "add" permissions in columns the way we add numbers.

We will "add" the permissions in some sense and write the result below the horizontal line. The result, which we call the computed permission, will be either A, P, or X. The function will return true or false based on the computed permission.

Before we start "adding," check the data to see if it contains a prohibit X anywhere. If it does, we're done. The computed permission is X. For our example...

   P  A  P
         A
   P  A  X
   A     P
      P  A
   --------
      X    <----- computed permission


If there is no X, the addition algorithm must be used. Unlike normal addition, the addition algorithm

  • starts on the bottom line and works its way up
  • considers one whole line at a time (rather than working in columns)
  • may stop with a result before reaching the top line.

Here is the algorithm:

  1. Start on the bottom line.
  2. If there is only one permission on the line, take its value as the computed permission and STOP
  3. If there are two more permissions on the line, add them using the following numerical equivalents: A = +1, P = -1
    1. If the sum is positive, the computed permission is A. STOP
    2. If the sum is negative, the computed permission is P. STOP
    3. If the sum is zero, the calculation is inconclusive. If this this is already the top line, the computed permission is P; STOP. Otherwise, move to the line above and go to step 2.

Notice that the algorithm stops when either (1) a conclusive result is obtained, or (2) the top line is reached without obtaining a conclusive result.

Let's take our original example, replacing the X by P to make it more interesting:

   P  A  P
         A
   P  A  P
   A     P
      P  A
   --------
      ?   

Now carry out the steps of the algorithm

  • There are two permissions on line 5
  • Since P + A = 0, the result is inconclusive and we must look at line 4.
  • There are two permissions on line 4.
  • Since A + P = 0, the result is inconclusive and we must look at line 3.
  • There are three permissions on line 3.
  • Since A + P + P = -1 we have a conclusive result! The computed permission is P.
   P  A  P
         A
   P  A  P
   A     P
      P  A
   --------
      P       <----- computed permission

If the computed permission had been A, the function would have returned true without further ado, allowing the user to perform the action.

However if the computed permission is P or X, the function does not immediately return false. Rather, it tests if the user has moodle/site:doanything = Allow (since this permission trumps all others). The function does this by calling itself:

       final result = has_capability(moodle/site:doanything, CONTEXT, USER);


Voir aussi