[3.0.x] Aperçu du système des permissions Intermédiaire

[3.0.x] Aperçu du système des permissions


» Aperçu du système des permissions pour les auteurs de MODs
Voici un aperçu du système des permissions qui est destiné aux auteurs de MODs. Ce guide est un aperçu du système des permissions, expliquant quelles informations sont stockées, où celles-ci sont stockées et comment elles sont utilisées. Il n'a pas la prétention d'être un guide d'utilisation pour configurer les permissions bien qu'il en recouvre certains aspects. L'auteur du tutoriel (poyntesm) précise qu'il a tenté de garantir à 100% la validité des informations fournies en vérifiant scrupuleusement le code. Cependant ce tutoriel n'est pas un document officiel, et pourrait donc comporter certaines erreurs qu'il ne faudra pas hésiter à lui faire remonter. Il espère que ce guide permettra aux gens intéressés d'en savoir un peu plus, sans avoir à étudier eux-mêmes le code.

» Qu'est-ce que le système des permissions ?
C'est le système qui autorise l'administrateur du forum à décider ce que les utilisateurs sont autorisés à faire sur le forum.

» Comment cela fonctionne-t-il ?
Un administrateur avec les permissions correctes (Oui, un administrateur a besoin de la permission de configurer les permissions ;) ) a accès au panneau d'administration (ACP = administration control panel, en anglais) qui contient le côté administratif du système des permissions. L'administrateur configure alors les permissions pour autoriser les utilisateurs à avoir le droit de faire certaines tâches ou de voir certaines fonctionnalités. Enfin, chaque permission est appelée "option de permission", et ces options sont attribuées, soit directement aux utilisateurs, soit à un groupe, soit par l'assignation d'un modèle à l'utilisateur ou au groupe.

» Quelles sont les options de permissions ?
Ce sont les options individuelles qui vous autorisent ou vous refusent l'accès à certaines fonctionnalités. Quelques exemples comme 'f_post', 'm_delete', 'a_ban' et 'u_sendpm.

» Que sont ces préfixes f_, m_, a_ et u_ dans les options ?
Ce sont ce qu'on appelle des types de permissions.

» Que sont les types de permissions ?
Les types de permissions regroupent les permissions de même type :
  • f_ étant le type de permission des forums
  • m_ étant le type de permission des modérateurs
  • a_ étant le type de permission des administrateurs
  • u_ étant le type de permission des utilisateurs.
» Où sont stockées les permissions de mes propres utilisateurs ?
Les permissions de vos utilisateurs sont stockées dans la table phpbb_users

» Quels champs de la table phpbb_users sont rattachés aux permissions ?
  • user_permissions => Englobe les permissions utilisateurs.
    Nous reviendrons plus tard sur la manière dont ce champ est rempli et quand il est mis à jour.
  • user_perm_from => Si vous avez l'option de permission a_switchperm alors vous pouvez tester les permissions d'un autre utilisateur. Si vous faites cela, ce champ contient l'user_id de celui dont vous détenez les permissions. Normalement c'est 0.
» Où sont stockées les options de permissions ?
Elles sont stockées dans la table phpbb_acl_options.

» Quels champs peut-on y trouver et que veulent-ils dire ?
  • auth_option_id => ID unique de l'option.
  • auth_option => Nom de l'option de permission.
  • is_global => Mis sur 1 si c'est une option globale sinon mis sur 0.
  • is_local => Mis sur 1 si c'est une option locale sinon mis sur 0.
  • founder_only => Mis sur 1 si c'est une option réservée aux administrateurs fondateurs sinon mis sur 0.
» Qu'est-ce qu'une option de permission locale ?
Une option de permission locale est une option qui peut être accordée à un utilisateur sur une base de permissions forum par forum. Cela vous autorise à accorder aux utilisateurs le choix de pouvoir accomplir une tâche dans un forum mais pas dans un autre. On les appelle aussi permissions basées sur les forums.

» Qu'est-ce qu'une option de permission globale ?
Une option de permission globale est une option qui est accordée sur l'ensemble du forum.

» Une option de permission peut-elle être à la fois globale et locale ?
Oui. Une option peut être les deux. Par exemple, 'm_edit' est la permission du modérateur pour éditer un sujet. Vous pouvez l'accorder à un utilisateur sur un forum. Un autre utilisateur peut se la voir accorder sur l'ensemble du forum. Pour autoriser ces deux cas de figure, l'option doit être configurable localement et globalement.

» Qu'est-ce qu'une option 'seulement pour le fondateur' (founder only) ?
Il s'agit d'une permission que seul un administrateur fondateur du forum peut avoir.

» Toutes les permissions de phpBB sont-elles par défaut uniquement attribuées aux administrateurs fondateurs ?
Non

» Qu'est-ce qu'un fondateur ?
Un fondateur est un type spécial d'utilisateur. Ce rang doit seulement être accordé aux administrateurs les plus dignes de confiance. Un fondateur a accès au système des permissions pour récupérer ses permissions même si un autre utilisateur les lui a supprimées. Seul un fondateur peut retirer à un autre fondateur son statut de fondateur.

» Que sont les modèles ?
Les modèles sont des configurations prédéfinies d'options de permissions qui peuvent être appliquées à des utilisateurs ou à des groupes. Si vous changez les options de permissions d'un modèle, les utilisateurs ou les groupes auxquels ce modèle est assigné verront automatiquement leurs permissions mises à jour.

» Où les modèles sont-ils stockés ?
Ils sont stockés dans la table phpbb_acl_roles.

» Quels champs peut-on y trouver et que veulent-ils dire ?
  • role_id => ID unique d'une option.
  • role_name => Nom du modèle (généralement sous la forme d'une clé de langue).
  • role_description => Description du modèle (généralement sous la forme d'une clé de langue).
  • role_type => a_, u_, m_ ou f_ en fonction du type de modèle pour lequel l'option est destinée.
  • role_order => Nombre indiquant l'ordre d'affichage dans le panneau d'administration.
» Où sont stockées les options de permissions pour un modèle ?
Elles sont stockées dans la table phpbb_acl_roles_data.

» Quels champs peut-on y trouver et que veulent-ils dire ?
  • role_id => ID du modèle stocké dans la table phpbb_acl_roles.
  • auth_option_id => ID de l'option stocké dans la table phpbb_acl_options.
  • auth_setting => Stocke soit ACL_YES (1), ACL_NO (-1) soit ACL_NEVER (0).
» Que veulent dire ces ACL_YES, ACL_NO et ACL_NEVER ?
Vos permissions effectives pour chaque option sont basées sur une combinaison de détails telle que les groupes auxquels vous appartenez, le modèle auquel vous êtes assigné et si cette permission vous a été assignée directement. Ainsi, vous pouvez avoir des permissions qui s'opposent les unes aux autres. Le système OUI, NON et JAMAIS fonctionne de manière à autoriser phpBB à combiner ces différentes réponses pour une option et ainsi vous donner les permissions effectives. Si quelque part vous avez un JAMAIS ce seront vos permissions pour cette option... un OUI ne peut pas avoir la priorité sur un JAMAIS. Cependant un OUI a la priorité sur un NON.

» Que se passe-t-il si j'ai une option globale configurée sur NON mais aussi la même option en local configurée sur OUI ?
Cela dépend en partie de la manière dont la vérification est faite. Si acl_get est appelé sans une ID de forum alors seule l'option globale sera vérifiée. Si un ID de forum est fourni alors l'option locale sera combinée avec l'option globale. Si l'option locale est sur OUI alors l'option globale le sera aussi et vice-versa. Il faut également savoir que lors de la vérification des permissions d'un utilisateur, la réponse ne peut être que OUI ou NON. Le système OUI|NON|JAMAIS est seulement utilisé pour amener la configuration finale OUI|NON. L'exemple au-dessus est un bon pense-bête pour rappeler que les permission locales et globales sont deux choses différentes. Il y a aussi une vérification appelée acl_getf_global qui est effective de la même manière que acl_get().

» Si j'assigne un modèle à un utilisateur, où est-ce stocké ?
Cela est stocké dans la table phpbb_acl_users.

» Quels champs peut-on y trouver et que veulent-ils dire ?
  • user_id => ID de l'utilisateur stocké dans la table phpbb_users.
  • forum_id => ID du forum stocké dans la table phpbb_forums s'il s'agit d'une une option locale sinon 0.
  • auth_option_id => ID de l'option stocké dans la table phpbb_acl_options.
  • auth_role_id => ID du modèle stocké dans la table phpbb_acl_roles, si provenant d'un modèle sinon 0.
  • auth_setting => Stocke soit ACL_YES (1), ACL_NO (-1) soit ACL_NEVER (0).

» Si j'assigne un modèle à un groupe, où est-ce stocké ?
Cela est stocké dans la table phpbb_acl_groups.

» Quels champs peut-on y trouver et que veulent-ils dire ?
  • group_id => ID du groupe stocké dans la table phpbb_groups.
  • forum_id => ID du forum stocké dans la table phpbb_forums si c'est une option locale, sinon 0.
  • auth_option_id => ID de l'option stocké dans la table phpbb_acl_options.
  • auth_role_id => ID de modèle stocké dans la table phpbb_acl_roles si provenant d'un rôle, sinon 0
  • auth_setting => Stocke soit ACL_YES (1), ACL_NO (-1) soit ACL_NEVER (0).
» Finalement, comment puis-je configurer les permissions maintenant que je connais les différents paramètres en jeu ?
Vous devez en premier lieu définir ce à quoi vous voulez parvenir. Si vous avez besoin d'autoriser un utilisateur à avoir juste une seule option de permission supplémentaire alors définir cette permission côté utilisateur devrait convenir. Sinon il est préférable de configurer les options de permissions pour un groupe et de mettre cet utilisateur dans ce groupe. Ou si vous désirez configurer un nombre important d'options de permissions alors la création d'un modèle sera plus appropriée. Vous avez également besoin de comprendre si les options sont globales ou locales. Pour configurer les permissions globales dans l'onglet 'Permissions', vous pouvez sélectionner 'Permissions des utilisateurs', 'Permissions des groupes', 'Administrateurs' ou 'Modérateurs globaux'. Si vous sélectionnez les deux dernières options, vous aurez d'abord à sélectionner le forum dans lequel les options de permissions seront effectives.
Pour configurer les permissions basiques des forums dans l'onglet 'Permissions' vous pouvez sélectionner 'Permissions des forums', 'Modérateurs des forums', 'Permissions utilisateurs/forums' ou 'Permissions groupes/forums'. Si vous sélectionnez les deux dernières options, vous aurez d'abord besoin de sélectionner l'utilisateur/le groupe et ensuite le forum dans lequel les options de permissions seront effectives.
Pour configurer les permissions de modèle dans l'onglet 'Permissions' vous pouvez sélectionner 'Modèles d'administration', 'Modèles d'utilisateurs', 'Modèles de Modérateurs' ou 'Modèles de forum'.

» Quand je configure les permissions avancées ou les modèles définis, que représentent ces onglets ?
Chacun de ces onglets représentent une catégorie de permissions. Les catégories sont utilisées pour permettre un regroupement des options de permission.

» Finalement, où peuvent être configurées les permissions dans le panneau d'administration ?
Le panneau d'administration peut être agencé pour placer les modules en plusieurs endroits. Ainsi, bien que quelques-unes des manières soient listées au-dessus, il y en a d'autres et les administrateurs peuvent les déplacer.

» Très bien. Je pense que j'ai réussi à configurer les permissions. Comment puis-je voir les permissions qu'un utilisateur/groupe obtiendra ?
Vous verrez les permissions d'un utilisateur/ groupe en regardant ses masques de permissions.

Que sont les masques de permission ?
Les masques sont les permissions effectives qu'un utilisateur possède pour différents types de permissions comme nous l'avons déjà décrit. Vous avez des permissions basiques des utilisateurs, des permissions de modérateur global, des permissions de modération des forums, des permissions basiques de forums et des permissions d'administration. Aussi, pour chacune de ces options, vous avez un masque de permissions qui peut être consultable dans l'administration. Pour les permissions basiques des forums et pour les permissions de modération des forums, vous devez d'abord sélectionner le forum que vous voulez vérifier.

Comment puis-je utiliser les masques de permissions ?
De l'onglet 'Permissions' , vous pouvez sélectionner 'Permissions d'administration', 'Permissions basiques des utilisateurs', 'Permissions des modérateurs globaux', 'Permissions de modération des forums' et 'Permissions basiques des forums'. Si vous sélectionnez les deux dernières options, vous aurez d'abord besoin de sélectionner le forum dont vous voulez voir les permissions. En consultant les masques, vous pouvez apercevoir les permissions pour un seul/de multiples utilisateur(s), ou un/des groupe(s). Dans la mesure où les permissions d'un utilisateur peuvent provenir de l'appartenance à plusieurs groupes, vous pouvez tracer les permissions.

En quoi consiste le traçage des permissions ?
En consultant les masques des permissions pour un utilisateur une icône (image) apparaît à côté de chaque option et indique comment l'option obtient sa valeur. Cela commencera par la valeur par défaut et ensuite vérifiera chaque groupe auquel l'utilisateur appartient et également en dernier lieu, les permissions spécifiques à l'utilisateur. Pour chaque groupe ou finalement les permissions de l'utilisateur, il vérifiera les différentes options et mettra à jour le résultat. Rappelez-vous qu'un JAMAIS aura toujours la priorité sur un OUI. C'est un outil très utile pour déterminer pourquoi un utilisateur a ou n'a pas tel ou tel type de permissions. Le résultat final indique les permissions effectives pour chaque option.

Comment les permissions s'appliquent-elles pour une page quand un utilisateur la regarde ?
Quand un utilisateur (rappelez-vous que les robots et les invités sont aussi des utilisateurs) regarde une page, une session est démarrée avec $user->session_begin(); Ensuite, la fonction suivante est appelée $auth->acl($user->data); cela applique les permissions de l'utilisateur. Cette fonction $auth->acl vérifie si le champ user_permission que nous avons mentionné plus tôt a besoin d'une mise à jour. Quand les permissions sont mises à jour par le panneau d'administration, ce champ est remis à zéro. Si vous avez configuré les permissions pour un utilisateur unique alors seul le champ de cet utilisateur est remis à zéro sinon il est remis à zéro pour tous les utilisateurs. Aussi, à la prochaine connexion, la fonction acl doit le remplir à nouveau avec de nouvelles options de permissions pour l'utilisateur. Il vérifie d'abord le cache pour _acl_options, le met à jour si besoin, puis reconstruit les permissions de l'utilisateur. Sinon, si le cache est correct mais que le champ des permissions de l'utilisateur est vide, il reconstruit juste les permissions de l'utilisateur. Si le cache ainsi que les permissions de l'utilisateur sont corrects alors le champ est laissé tel quel. Le champ passe alors d'un simple caractère à un tableau et c'est ce tableau que nous vérifions lors de la visualisation du masque des permissions d'un utilisateur.


Donc que contient le cache de acl_options ?
Ce cache contient un tableau à deux éléments : local et global. Chacun d'entre-eux est un tableau qui contient chacun des options acl de ce type. Ainsi, comme avec tout paramètre du cache, le forum vérifie la validité du cache et le met à jour si nécessaire.

Bien, maintenant que la page de mes permissions d'utilisateurs est configurée, comment puis-je vérifier si un utilisateur possède une permission unique ?
Vous appelez la fonction $auth->acl_get('u_garage_browse'); et l'argument (ici garage_browse) est l'option que vous voulez vérifier. Si elle est particulière à un forum ( par ex: locale) alors vous le faites de cette manière $auth->acl_get('u_garage_browse', 3); où 3 est l'ID du forum.

J'ai créé une permission réservée à un forum. Comment puis-je trouver les forums où un utilisateur peut l'utiliser ?
Vous appellez la fonction $auth->acl_getf('f_your_permission');

Puis-je vérifier plus d'une option ?
Oui. En utilisant $auth->acl_gets(option1[, option2, ..., optionN, forum]);

Comment puis-je ajouter mes propres permissions pour un MOD ?
Vous devez d'abord comprendre qu'il y a deux endroits où rajouter des permissions :
  • Base de données
  • Langue
Pour les ajouter à la base de données, vous devez toujours utiliser les fonctions propres à phpBB. Car elles prennent en compte le système de cache, etc.

Code: Tout sélectionner
            <?php
            define
('IN_PHPBB', true);
            $phpbb_root_path = './';
            $phpEx = substr(strrchr(__FILE__, '.'), 1);
            include($phpbb_root_path . 'common.' . $phpEx);
            $user->session_begin();
            $auth->acl($user->data);
            $user->setup();
            include($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
            $auth_admin = new auth_admin();

            $auth_admin->acl_add_option(array(
                'local'      => array(),
                'global'   => array('u_your_mod', 'm_your_mod')
            ));
            ?>
            <?php
            if 
(empty($lang) || !is_array($lang))
            {
                $lang = array();
            }

            $lang['permission_cat']['your_mod'] = 'My amazing MOD';

            $lang = array_merge($lang, array(
                'acl_u_your_mod'    => array('lang' => 'Can use amazing MOD', 'cat' => 'your_mod'),
                'acl_m_your_mod'    => array('lang' => 'Can moderate amazing MOD', 'cat' => 'your_mod'),
            ));
            ?>


Ce code créera deux nouvelles permissions globales, une permission pour l'utilisateur et une autre pour le modérateur. Maintenant, occupons-nous de la partie langue.

Code: Tout sélectionner
            <?php
            if 
(empty($lang) || !is_array($lang))
            {
                $lang = array();
            }

            $lang['permission_cat']['your_mod'] = 'My amazing MOD';

            $lang = array_merge($lang, array(
                'acl_u_your_mod'    => array('lang' => 'Can use amazing MOD', 'cat' => 'your_mod'),
                'acl_m_your_mod'    => array('lang' => 'Can moderate amazing MOD', 'cat' => 'your_mod'),
            ));
            ?>
            <?php
            
//examples of granting user, group & role
            update_user_permissions('grant', $username, array('u_your_mod', 'm_your_mod'));
            update_group_permissions('grant',$group_name, array('u_your_mod', 'm_your_mod') );
            update_role_permissions('grant',$role_name, array('u_your_mod', 'm_your_mod') );
            //examples of removing user, group & role
            update_user_permissions('remove', $username, array('u_your_mod', 'm_your_mod'));
            update_group_permissions('remove',$group_name, array('u_your_mod', 'm_your_mod') );
            update_role_permissions('remove',$role_name, array('u_your_mod', 'm_your_mod') );
            ?>


Comment puis-je faire en sorte qu'à l'installation du MOD les permissions soient définies automatiquement ?
Par défaut, vous ne pouvez pas. Comme nous l'avons appris plus haut, quand phpBB met à jour les permissions pour les utilisateurs/groupes/modèles, cela établit l'ensemble des permissions et les met à jour comme une insertion multiple. Cette approche est trop complexe pour tenter de l'appliquer à un MOD et n'est pas le standard phpBB. Une approche plus simple consiste à utiliser des fonctions comme celles qui suivent. Ces fonctions vérifient si l'utilisateur/le groupe/le modèle a déjà les permissions et si c'est le cas, ne les ajoute pas, sinon il ajoute les options de permissions et nettoie le cache. Il y a trois fonctions fournies plus bas, une pour les utilisateurs, une pour les groupes, une pour les modèles. Chacune fonctionne de la même manière. D'abord la première variable définit si vous ajoutez ou supprimer des permissions, ensuite une seconde variable définit un nom d'utilisateur, un nom de groupe ou un nom de modèle, la troisième définit un tableau des permissions que vous voulez ajouter/supprimer, enfin la quatrième définit le ACL_YES|ACL_NO|ACL_NEVER dont nous avons parlé plus tôt.

Code: Tout sélectionner
            <?php
            
//examples of granting user, group & role
            update_user_permissions('grant', $username, array('u_your_mod', 'm_your_mod'));
            update_group_permissions('grant',$group_name, array('u_your_mod', 'm_your_mod') );
            update_role_permissions('grant',$role_name, array('u_your_mod', 'm_your_mod') );
            //examples of removing user, group & role
            update_user_permissions('remove', $username, array('u_your_mod', 'm_your_mod'));
            update_group_permissions('remove',$group_name, array('u_your_mod', 'm_your_mod') );
            update_role_permissions('remove',$role_name, array('u_your_mod', 'm_your_mod') );
            ?>

Donc voici chacune de ces fonctions, vous pouvez les ajouter dans vos scripts d'installation et les appeler comme décrit au-dessus.

Mise à jour des permissions d'utilisateurs

Code: Tout sélectionner
            <?php
            
/**
            * Update role-specific ACL options. Function can grant or remove options. If option already granted it will NOT be updated.
            *
            * @param grant|remove $mode defines whether roles are granted to removed
            * @param strong $role_name role name to update
            * @param mixed $options auth_options to grant (a auth_option has to be specified)
            * @param ACL_YES|ACL_NO|ACL_NEVER $auth_setting defines the mode acl_options are getting set with
            *
            */
            function update_user_permissions($mode = 'grant', $username, $options = array(), $auth_setting = ACL_YES)
            {
                global $db, $auth, $cache;

                //First We Get User ID
                $sql = "SELECT u.user_id
                    FROM "
 . USERS_TABLE . " u
                    WHERE username = '
$username'";
                $result = $db->sql_query($sql);
                $user_id = (int) $db->sql_fetchfield('user_id');
                $db->sql_freeresult($result);

                //Now Lets Get All Current Options For User
                $user_options = array();
                $sql = "SELECT auth_option_id
                    FROM "
 . ACL_USERS_TABLE . "
                    WHERE user_id = "
 . (int) $user_id . "
                    GROUP BY auth_option_id"
;
                $result = $db->sql_query($sql);
                while ($row = $db->sql_fetchrow($result))
                {
                    $user_options[] = $row;
                }
                $db->sql_freeresult($result);

                //Get Option ID Values For Options Granting Or Removing
                $acl_options_ids = array();
                $sql = "SELECT auth_option_id
                    FROM "
 . ACL_OPTIONS_TABLE . "
                    WHERE "
 . $db->sql_in_set('auth_option', $options) . "
                    GROUP BY auth_option_id"
;
                $result = $db->sql_query($sql);
                while ($row = $db->sql_fetchrow($result))
                {
                    $acl_options_ids[] = $row;
                }
                $db->sql_freeresult($result);


                //If Granting Permissions
                if ($mode == 'grant')
                {
                    //Make Sure We Have Option IDs
                    if (empty($acl_options_ids))
                    {
                        return false;
                    }
                    
                    
//Build SQL Array For Query
                    $sql_ary = array();
                    for ($i = 0, $count = sizeof($acl_options_ids);$i < $count; $i++)
                    {

                        //If Option Already Granted To User Then Skip It
                        if (in_array($acl_options_ids[$i]['auth_option_id'], $user_options))
                        {
                            continue;
                        }
                        $sql_ary[] = array(
                            'user_id'        => (int) $user_id,
                            'auth_option_id'    => (int) $acl_options_ids[$i]['auth_option_id'],
                            'auth_setting'        => $auth_setting,
                        );
                    }

                    $db->sql_multi_insert(ACL_USERS_TABLE, $sql_ary);
                    $cache->destroy('acl_options');
                    $auth->acl_clear_prefetch();
                }

                //If Removing Permissions
                if ($mode == 'remove')
                {
                    //Make Sure We Have Option IDs
                    if (empty($acl_options_ids))
                    {
                        return false;
                    }
                    
                    
//Process Each Option To Remove
                    for ($i = 0, $count = sizeof($acl_options_ids);$i < $count; $i++)
                    {
                        $sql = "DELETE
                            FROM "
 . ACL_USERS_TABLE . "
                            WHERE auth_option_id = "
 . $acl_options_ids[$i]['auth_option_id'];

                        $db->sql_query($sql);
                    }

                    $cache->destroy('acl_options');
                    $auth->acl_clear_prefetch();
                }

                return;
            }
            ?>


Mise à jour des permissions de groupes

Code: Tout sélectionner
            <?php
            
/**
            * Update group-specific ACL options. Function can grant or remove options. If option already granted it will NOT be updated.
            *
            * @param grant|remove $mode defines whether roles are granted to removed
            * @param string $group_name group name to update
            * @param mixed $options auth_options to grant (a auth_option has to be specified)
            * @param ACL_YES|ACL_NO|ACL_NEVER $auth_setting defines the mode acl_options are getting set with
            *
            */
            function update_group_permissions($mode = 'grant', $group_name, $options = array(), $auth_setting = ACL_YES)
            {
                global $db, $auth, $cache;

                //First We Get Group ID
                $sql = "SELECT g.groupe_id
                    FROM "
 . GROUPS_TABLE . " g
                    WHERE group_name = '
$group_name'";
                $result = $db->sql_query($sql);
                $group_id = (int) $db->sql_fetchfield('group_id');
                $db->sql_freeresult($result);

                //Now Lets Get All Current Options For Role
                $group_options = array();
                $sql = "SELECT auth_option_id
                    FROM "
 . ACL_GROUPS_TABLE . "
                    WHERE group_id = "
 . (int) $group_id . "
                    GROUP BY auth_option_id"
;
                $result = $db->sql_query($sql);
                while ($row = $db->sql_fetchrow($result))
                {
                    $group_options[] = $row;
                }
                $db->sql_freeresult($result);

                //Get Option ID Values For Options Granting Or Removing
                $sql = "SELECT auth_option_id
                    FROM "
 . ACL_OPTIONS_TABLE . "
                    WHERE "
 . $db->sql_in_set('auth_option', $options) . "
                    GROUP BY auth_option_id"
;
                $result = $db->sql_query($sql);
                while ($row = $db->sql_fetchrow($result))
                {
                    $acl_options_ids[] = $row;
                }
                $db->sql_freeresult($result);


                //If Granting Permissions
                if ($mode == 'grant')
                {
                    //Make Sure We Have Option IDs
                    if (empty($acl_options_ids))
                    {
                        return false;
                    }
                    
                    
//Build SQL Array For Query
                    $sql_ary = array();
                    for ($i = 0, $count = sizeof($acl_options_ids);$i < $count; $i++)
                    {

                        //If Option Already Granted To Role Then Skip It
                        if (in_array($acl_options_ids[$i]['auth_option_id'], $group_options))
                        {
                            continue;
                        }
                        $sql_ary[] = array(
                            'group_id'        => (int) $group_id,
                            'auth_option_id'    => (int) $acl_options_ids[$i]['auth_option_id'],
                            'auth_setting'        => $auth_setting,
                        );
                    }

                    $db->sql_multi_insert(ACL_GROUPS_TABLE, $sql_ary);
                    $cache->destroy('acl_options');
                    $auth->acl_clear_prefetch();
                }

                //If Removing Permissions
                if ($mode == 'remove')
                {
                    //Make Sure We Have Option IDs
                    if (empty($acl_options_ids))
                    {
                        return false;
                    }
                    
                    
//Process Each Option To Remove
                    for ($i = 0, $count = sizeof($acl_options_ids);$i < $count; $i++)
                    {
                        $sql = "DELETE
                            FROM "
 . ACL_GROUPS_TABLE . "
                            WHERE auth_option_id = "
 . $acl_options_ids[$i]['auth_option_id'];

                        $db->sql_query($sql);
                    }

                    $cache->destroy('acl_options');
                    $auth->acl_clear_prefetch();
                }

                return;
            }
            ?>


Mise à jour des permissions de modèles

Code: Tout sélectionner
<?php
            
/**
            * Update role-specific ACL options. Function can grant or remove options. If option already granted it will NOT be updated.
            *
            * @param grant|remove $mode defines whether roles are granted to removed
            * @param strong $role_name role name to update
            * @param mixed $options auth_options to grant (a auth_option has to be specified)
            * @param ACL_YES|ACL_NO|ACL_NEVER $auth_setting defines the mode acl_options are getting set with
            *
            */
            function update_role_permissions($mode = 'grant', $role_name, $options = array(), $auth_setting = ACL_YES)
            {
                global $db, $auth, $cache;

                //First We Get Role ID
                $sql = "SELECT r.role_id
                    FROM "
 . ACL_ROLES_TABLE . " r
                    WHERE role_name = '
$role_name'";
                $result = $db->sql_query($sql);
                $role_id = (int) $db->sql_fetchfield('role_id');
                $db->sql_freeresult($result);

                //Now Lets Get All Current Options For Role
                $role_options = array();
                $sql = "SELECT auth_option_id
                    FROM "
 . ACL_ROLES_DATA_TABLE . "
                    WHERE role_id = "
 . (int) $role_id . "
                    GROUP BY auth_option_id"
;
                $result = $db->sql_query($sql);
                while ($row = $db->sql_fetchrow($result))
                {
                    $role_options[] = $row;
                }
                $db->sql_freeresult($result);

                //Get Option ID Values For Options Granting Or Removing
                $acl_options_ids = array();
                $sql = "SELECT auth_option_id
                    FROM "
 . ACL_OPTIONS_TABLE . "
                    WHERE "
 . $db->sql_in_set('auth_option', $options) . "
                    GROUP BY auth_option_id"
;
                $result = $db->sql_query($sql);
                while ($row = $db->sql_fetchrow($result))
                {
                    $acl_options_ids[] = $row;
                }
                $db->sql_freeresult($result);


                //If Granting Permissions
                if ($mode == 'grant')
                {
                    //Make Sure We Have Option IDs
                    if (empty($acl_options_ids))
                    {
                        return false;
                    }
                    
                    
//Build SQL Array For Query
                    $sql_ary = array();
                    for ($i = 0, $count = sizeof($acl_options_ids);$i < $count; $i++)
                    {

                        //If Option Already Granted To Role Then Skip It
                        if (in_array($acl_options_ids[$i]['auth_option_id'], $role_options))
                        {
                            continue;
                        }
                        $sql_ary[] = array(
                            'role_id'        => (int) $role_id,
                            'auth_option_id'    => (int) $acl_options_ids[$i]['auth_option_id'],
                            'auth_setting'        => $auth_setting,
                        );
                    }

                    $db->sql_multi_insert(ACL_ROLES_DATA_TABLE, $sql_ary);
                    $cache->destroy('acl_options');
                    $auth->acl_clear_prefetch();
                }

                //If Removing Permissions
                if ($mode == 'remove')
                {
                    //Make Sure We Have Option IDs
                    if (empty($acl_options_ids))
                    {
                        return false;
                    }
                    
                    
//Process Each Option To Remove
                    for ($i = 0, $count = sizeof($acl_options_ids);$i < $count; $i++)
                    {
                        $sql = "DELETE
                            FROM "
 . ACL_ROLES_DATA_TABLE . "
                            WHERE auth_option_id = "
 . $acl_options_ids[$i]['auth_option_id'];

                        $db->sql_query($sql);
                    }

                    $cache->destroy('acl_options');
                    $auth->acl_clear_prefetch();
                }

                return;
            }
            ?>

Source: Traduction de l'article phpBB.com

Plasma
Roi des posts
Roi des posts
 
Rédigé le: 27 Mai 2008 à 23:08
Articles: 5
Noter cet article: 123456 Votants: Aucun
Mots-clés: Aperçu, du, système, des, permissions, auteurs, de, MODs, 30x

Retourner vers Développement


cron