<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://dotclear.watch/feed/rss2/xslt" ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>DotclearWatch / Blog - Mot-clé - permission</title>
    <link>https://dotclear.watch/</link>
    <atom:link href="https://dotclear.watch/feed/tag/permission/rss2" rel="self" type="application/rss+xml" />
    <description>Suivez l'évolution du moteur de blogs Dotclear.</description>
    <language>fr</language>
    <pubDate>Sat, 30 May 2026 05:58:13 +0200</pubDate>
    <copyright>Tous droits réservés © Jean-Christian Denis</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>Dotclear</generator>
          <item>
        <title>Permissions de modules</title>
        <link>https://dotclear.watch/Billet/Permissions-de-modules-en-2.28</link>
        <guid isPermaLink="false">urn:md5:15d7c95c8020af2f4684b0d553449ac4</guid>
        <pubDate>Fri, 13 Oct 2023 08:00:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.28</category>
                          <category>2.28</category>
                  <category>My</category>
                  <category>permission</category>
                <description>&lt;p&gt;Dans la &lt;a href=&quot;https://dotclear.watch/Billet/Release-2.28&quot;&gt;version 2.28&lt;/a&gt; de Dotclear, la classe &lt;strong&gt;My&lt;/strong&gt; d'aide aux modules peut gérer complètement leurs permissions.&lt;/p&gt; &lt;p&gt;Depuis quelques versions de Dotclear une aide au développement des modules (plugins et thèmes) est disponible, elle est depuis bien utilisée par les modules de la distribution et par nombre de modules tiers. La version 2.28, complète la classe My en lui ajoutant une nouvelle constante de contexte appelée MODULE. Celle-ci va permettre de supprimer la difficulté d'utiliser des classes dans le fichier _define.php en déplaçant la partie permissions de ce fichier.&lt;br /&gt;
Pour déplacer ces permissions et s'affranchir d'appels de classe hasardeux, il suffit d'indiquer dans le fichier _define.php du module qu'on déporte la gestion de permissions, puis dans le fichier My de vérifier ces permissions.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Premier exemple&lt;/h5&gt;

&lt;p&gt;Exemple du fichier &lt;strong&gt;\_define.php&lt;/strong&gt; du plugin attachments de la distribution :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
use Dotclear\App;

$this-&amp;gt;registerModule(
    // ...
    [
        // On indiquait la nécessité des droits usage, content admin ou pages pour utiliser ce plugin
        &amp;#039;permissions&amp;#039; =&amp;gt; App::auth()-&amp;gt;makePermissions([
            App::auth()::PERMISSION_USAGE,
            App::auth()::PERMISSION_CONTENT_ADMIN,
            initPages::PERMISSION_PAGES,
        ]),
        // ...
    ]
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Qui deviendra simplement :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
$this-&amp;gt;registerModule(
    // ...
    [
        &amp;#039;requires&amp;#039;    =&amp;gt; [[&amp;#039;pages&amp;#039;]],
        // On indique qu&amp;#039;on délègue à la class My la gestion des droits
        &amp;#039;permissions&amp;#039; =&amp;gt; &amp;#039;My&amp;#039;,
        // ...
    ]
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Plus de problème d'appel de classe potentiellement inexistante ici, puisqu'on va tester la disponibilité de module requis avec la directive &lt;code&gt;requires&lt;/code&gt; avant de vouloir utiliser sa classe. Mais il faut bien tester les droits qu'on a enlevés, pour cela on va ajouter une règle dans le fichier &lt;strong&gt;\src\My.php&lt;/strong&gt; du module :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
declare(strict_types=1);

namespace Dotclear\Plugin\attachments;

use Dotclear\App;
use Dotclear\Module\MyPlugin;
use Dotclear\Plugin\pages\Pages;

class My extends MyPlugin
{
   // On va gérer des droits particuliers
    public static function checkCustomContext(int $context): ?bool
    {
       // On recherche le contexte de droit
        return match($context) {
            // On utilise le nouveau contexte de droit global pour autoriser un utilisateur avec les droits sur les billets et les pages
            // Attention ici le test demande si on est côté admin avec des droits ou côté public sans besoin de droits !
            self::MODULE =&amp;gt; !App::task()-&amp;gt;checkContext(&amp;#039;BACKEND&amp;#039;)
                || (
                    App::blog()-&amp;gt;isDefined()
                    &amp;amp;&amp;amp; App::auth()-&amp;gt;check(App::auth()-&amp;gt;makePermissions([
                        App::auth()::PERMISSION_USAGE,
                        App::auth()::PERMISSION_CONTENT_ADMIN,
                        Pages::PERMISSION_PAGES,
                    ]), App::blog()-&amp;gt;id())
                ),

            // Pour tous les autres contextes, on laisse les droits par défaut
            default =&amp;gt; null,
        };
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On voit ici que du fait de cette nouvelle gestion, les constantes de module comme les permissions ou les noms de tables de bases de données n'ont plus besoin d'être dans un fichier spécial à la racine du module puisque dorénavant on teste ces permissions après le chargement des modules et donc on a accès  à toutes les classes des modules pour les tests. Les constantes de permissions et de tables des modules de la distribution ont donc été déplacés dans leurs classes principales, c'est le cas de &lt;strong&gt;Antispam&lt;/strong&gt;, &lt;strong&gt;Blogroll&lt;/strong&gt; et &lt;strong&gt;Pages&lt;/strong&gt;.&lt;/p&gt;

&lt;h5&gt;Second exemple&lt;/h5&gt;

&lt;p&gt;Exemple du fichier &lt;strong&gt;\_define.php&lt;/strong&gt; du plugin tags de la distribution :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
use Dotclear\App;

$this-&amp;gt;registerModule(
    // ...
    [
        &amp;#039;permissions&amp;#039; =&amp;gt; &amp;#039;App::auth()-&amp;gt;makePermissions([
                    App::auth()::PERMISSION_USAGE,
                    App::auth()::PERMISSION_CONTENT_ADMIN,
                ])&amp;#039;,
        // ...
    ]
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Qui deviendra simplement :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
$this-&amp;gt;registerModule(
    // ...
    [
        &amp;#039;permissions&amp;#039; =&amp;gt; &amp;#039;My&amp;#039;,
        // ...
    ]
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Quand au fichier &lt;strong&gt;\src\My.php&lt;/strong&gt; du module, il ne changera pas puisqu'on vérifiait déjà ces droits :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
declare(strict_types=1);

namespace Dotclear\Plugin\tags;

use Dotclear\App;
use Dotclear\Module\MyPlugin;

class My extends MyPlugin
{
    public static function checkCustomContext(int $context): ?bool
    {
        return match ($context) {
            // On indique que la page de gestion et le menu sont autorisés à un utilisateur ayant les droits usage ou content admin
            // On n&amp;#039;a pas eu besoin de changer quoi que ce soit ici
            self::MANAGE, self::MENU =&amp;gt; App::task()-&amp;gt;checkContext(&amp;#039;BACKEND&amp;#039;)
                &amp;amp;&amp;amp; App::blog()-&amp;gt;isDefined()
                &amp;amp;&amp;amp; App::auth()-&amp;gt;check(App::auth()-&amp;gt;makePermissions([
                    App::auth()::PERMISSION_USAGE,
                    App::auth()::PERMISSION_CONTENT_ADMIN,
                ]), App::blog()-&amp;gt;id()),

            default =&amp;gt; null,
        };
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Un petit tour dans les fichiers &lt;strong&gt;My&lt;/strong&gt; des plugins de la distribution donnera un bon aperçu des différents cas possibles.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;q&gt;Le contenu de ce document a été écrit suivant le code de la version 2.28 de Dotclear.&lt;/q&gt;&lt;/em&gt;&lt;/p&gt;</description>
        
              </item>
      </channel>
</rss>
