7.25 GRANT et REVOKE

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
    ON {Nom_table | * | *.* | Nom_bdd.*}
    TO user_name [IDENTIFIED BY 'password']
        [, user_name [IDENTIFIED BY 'password'] ...]
    [WITH GRANT OPTION]
REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
    ON {Nom_table | * | *.* | Nom_bdd.*}
    FROM user_name [, user_name ...]

GRANT est implémenté depuis la version 3.22.11de MySQL. Pour les ancienne versions, la commande GRANT ne fait rien.

Les commandes GRANT et REVOKE permettent aux administrateurs système de donner et enlever des droits aux utilisateurs :

  • niveau général (Global level) : Les droits de niveau général s'applique à toutes les bases de données du serveur. Ces droits sont stocké dans la table mysql.user.
  • Niveau base de données (Database level): Les droits de niveau base de données s'applique aux tables d'une base de données. Ces droits sont stockés dans les tables mysql.db et mysql.host.
  • Niveau table (Table level) : Les droits de niveau table s'appliquent aux colonnes d'une table donnée. apply to all columns in a given table. Ces droits sont stockés dans la table mysql.tables_priv .
  • Niveu colonne (Column level) : Les droits de niveau colonne s'appliquent à une colonn donnée d'une table donnée. to single columns in a given table. Ces droits sont stockés dans la table mysql.columns_priv .

    Les commandes GRANT et REVOKE peuvent s'appliquer aux droits suivants, précisés dans priv_type:

    ALL PRIVILEGES      FILE                RELOAD
    ALTER               INDEX               SELECT
    CREATE              INSERT              SHUTDOWN
    DELETE              PROCESS             UPDATE
    DROP                REFERENCES          USAGE
    

    ALL est un synonyme de for ALL PRIVILEGES. REFERENCES n'est pas encore implémenté. USAGE est actuellement synonyme de ``aucun droits''.Il peut être utilisé pour créer un utilisateur sans droits.

    Pour enlever le droit de grant d'un utilisateur, il faut utiliser la valeur suivante dans priv_type :

    
    REVOKE GRANT OPTION ON ... FROM ...;
    

    Les seules valeurs de priv_type qu'il est possible de spécifier sont SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX et ALTER.

    Les seules valeurs de priv_type qu'il est possible de spécifier pour une colonne (c'est à dire, en utilisant la clause column_list) sont SELECT, INSERT et UPDATE.

    Il est possible de donner les droits généraux en utilisant la syntaxe ON *.* . Il est possible de donner des droits sur une base de données en utilisant la syntaxe ON Nom_bdd.* syntax. Si il y a une base de données courante, et que l'on spécifie ON *, cela revient à donner tous les droits pour la base de données courante . (Attention: Si il n'y a pas de base de données courante, cela revient à donner des droits sur le serveur entier! )

    Afin de pouvoir donner des droits à des utilisateurs d'hotes divers et variés, MySQL accepte la spécification de l'utilisateur sous la forme user@host. Pour pouvoir spécifier des noms d'utilisateur ou d'hotes ayant des caractères spéciaux dans le nom (comme ``-''), il suffit d'entourer le nom de l'utilisateur ou de l'hote de guillemets simples (i.e., 'test-user''test-hostname').

    Les noms d'hotes peuvent avoir des caractères jokers : Par exemple, user@"%.loc.gov" s'applique à tous les utilisateurs user pour tous les hotes du domaine loc.gov et user@"144.155.166.%" s'appliquera à tous les user pour des hotes dans le domaine 144.155.166 .

    La forme simplifié user est un synonyme de user@"%". Note: pour autoriser des utilisateurs anonymes sur le serveur MySQL (ce qui est le comportement par défaut), il faut aussi ajouter les utilisateurs locaux, grce à la forme user@localhost car sinon, la ligne pour l'utilisateur anonyme dans la table mysql.user sera utilisée quand l'utilisateur essaiera de se connecter à MySQL depuis la machine locale! Les utilisateurs anonymes sont définis en insérant une ligne User='' dans la table mysql.user . On peut vérifier si cela s'applique en exécutant la ligne suivante :

    mysql> SELECT Host,User FROM mysql.user WHERE User='';
    

    Pour le moment, la commande GRANT n'accepte que des hotes, tables, bases et colonnes dont le nom ne dépasse pas 60 caractères. Un nom d'utilisateur peut aller jusqu'à 16 caractères.

    Les privilèges pour une table ou une colonne sont constitués du OU logique de chacun des droits. Par exemple, si la table mysql.user précise que un utilisateur a un droit de select gloabal, cela ne peut pas être interdit par une entrée dans une base, une table ou une colonne.

    Les droits pour une colonne sont calculés comme suit :

    global privileges
    OR (database privileges AND host privileges)
    OR table privileges
    OR column privileges
    

    Dans la plupart des cas, les droits sont donnés aux utilisateurs avec les niveaux de droits, ce qui simplifie grandement la vie.

    Si des droits sont donnés à un couple user/hostname qui n'existe pas dans la table mysql.user, une entrée est insérée dans la table des droits, et elle reste valide jusqu'à ce qu'une commande DELETE l'efface. En d'autres termes, GRANT peut créer un utilisateur, mais REVOKE ne l'effacera pas. Il faut le faire explicitement avec DELETE.

    A partir de MySQL 3.22.12 , lors de la création d'un nouvel utilisateur ou avec les droits globaux, un mot de passe sera affecté avec la clause IDENTIFIED BY . Si l'utilisateur à déjà un mot de passe, il sera remplacé par le nouveau.

    Attention: Lors de la création d'un utilisateur, il aucun mot de passe n'est spécifiée, cet utilisateur n'aura pas de mot de passe. C'est très imprudent.

    Les mots de passe peuvent être assignés et modifiés avec la commande : SET PASSWORD . SET OPTION.

    Lors de l'attribution de droit de niveau base , une entrée est ajoutée dans la table mysql.db, si nécessaire. Quand toutes les privilèges poue la base de données sont supprimés avec REVOKE, l'entrée est effacée.

    Si un utilisateur n'a aucun droit sur uen table, la table n'est pas affichée quand l'utilisateur fait une requête sur cette table. La table ne sera même pas visible avec une commandes SHOW TABLES.

    La clause WITH GRANT OPTION donne à l'utilisateur la capacité de donner à d'autres utilisateurs des droits, d'un niveau égal à ceux qu'il a déjà. Il faut être très prudent quand on attribue ce droit, car deux utilisateurs avec des droits différents peuvent rassembler leurs droits.

    Il faut bien savoir que lorsqu'on donne à un utilisateur le droit de grant, tous les droits que possède cet utilisateur sont transmissible par cet utilisateur. Supposons que l'on ait donné des droits d'insertion à un utilisateur. Si on lui ajoute le droit de select sur une base, et qu'on lui ajoute en plus WITH GRANT OPTION, l'utilisateur peut donner les droits de selection et d'insertion à tout autre utilisateur. Et si on lui ajoute encore le droit de update, il pourra aussi donner ce droit.

    Il ne vaut mieux pas donner des droits de alter à un utilisateur normal. Dans ce cas, l'utilisateur peut essayer de pirater le système en renommant les tables de droits du système.

    Lors de l'utilisation des droits de table ou de colonne pour un utilisateur, le serveur examine les droits de table et de colonne pour tous les utilisateurs, et cela ralentit légérement MySQL.

    Quand mysqld démarre, tous les droits sont chargés en mémoire. Les droits de table, base et colonnes prennent effet aussitôt, et les droits d'utilisateur prennent effet à la première connexion. Les modifications des tables de droits sont faites avec les fonctions GRANT et REVOKE et sont repercutées par le serveur immédiatement.Si les tables de droits sont modifiées à la main (avec INSERT, UPDATE, etc.), il faut exécuter une commande FLUSH PRIVILEGES ou lancer l'utilitaire mysqladmin flush-privileges pour faire prendre en compte des nouveaux droits.

    Les différences les plus notables entre ANSI SQL et MySQL pour la commande GRANT sont:

    • ANSI SQL n' pas de droit de nvieau global ou base de données, et ANSI SQL ne supporte pas tous les types de droits de MySQL.
    • Lors de l'effacement d'une table en ANSI SQL, tous les privilèges de cette table sont révoqués. Lors de la révocation d'un droit avec ANSI SQL, tous les privilèges qui ont été octroyés avec ce droits sont aussi révoqués. Avec MySQL, les droits peuvent être abandonnés uniquement avec la commande REVOKE ou en manipulant (avec précautions) les tables de droits.