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.