Une fois que la connexion est établie, le serveur passe en niveau 2. Pour chaque requête entrante, le serveur va vérifier que les droits sont suffisants pour effectuer la requête, en fonction du type d'opération. C'est ici qu'interviennent les champs de droits des tables de droits. Ces droits peuvent être stockés dans les tables user
, db
, host
, tables_priv
ou columns_priv
tables. Ces tables sont gérées grce aux commandes GRANT
et REVOKE
. Reportez vous à la section Privileges
, dans laquelle les champs de ces tables sont présentés).
Les droits pris en charge par la table user
sont assignés globalement, et s'appliquent quelque soit la base de données courante. Par exemple, si la table user
donne les droits de delete, vous pouvez efface n'importe quelle base de donnée sur le serveur ! ! En d'autres termes, la table user
fourni les droits de super utilisateur, et il est avisé de ne donner ces droits qu'aux administrateurs du serveur. Pour les autres utilisateurs, il vaut mieux laisser les droits à 'N'
et donner des droits spécifiques sur les bases de données, avec les tables db
et host
.
Les tables db
et host
donnent des droits spécifiques aux bases de données. Les valeurs acceptées dans les champs sont les suivantes :
- Les caractères spéciaux ``%'' et ``_'' peuvent être utilisés dans les champs
Host
et Db
de deux tables.
- Un
'%'
dans le champs Host
de la table db
signifie ``tous les hôtes.'' Une valeur vide pour Host
dans la table db
signifie ``consulte la table host
pour plus de détails.''
- Un
'%'
ou une chaîne vide dans le champs Host
de la table host
signifie `` tous les hôtes.''
- Un
'%'
ou une chaîne vide dans le champs Db
dans l'une des tables signifie ``toutes les bases de données.''
- une chaîne vide dans le champs
User
dans l'une des tables corresponde à l'utilisateur anonyme.
Les tables db
et host
sont lues et triées au démarrage du serveur (en même temps que la table user
). La table db
est triée en fonction des champs Host
, Db
et User
, et la table host
table est triée en fonction des champs Host
Db
. Tout comme pour la table user
, le trie met les valeurs les plus précises en premier, puis le plus larges. Lors de l'utilisation de la table, la première valeur qui correspond à l'utilisateur est utilisée.
Les tables de droits tables_priv
et columns_priv
contiennent les droits spécifiques aux droits par table et par colonne. Les valeurs des champs peuvent être les suivantes :
- Les caractères spéciaux ``%'' et ``_'' peuvent être utilisés dans les champs
Host
et Db
de deux tables.
- Un
'%'
ou une chaîne vide dans le Host
de la table db
signifie ``tous les hôtes.''
- Les champs
Db
, Table_name
et Column_name
ne peuvent pas contenir de champs vide, ou de caractères spéciaux.
Les tables tables_priv
et columns_priv
sont triées en fonction des champs Host
, Db
et User
. Le tri est identique à celui de la table db
, mais étant donné que le champs Host
ne contient pas de caractère spéciaux, le tri est nettement plus simple.
Le processus de vérification de requête est décrit ci-dessous. (Si vous êtes familier avec la programmation de contrôle d'accès, vous remarquerez que la description qui suit est un peu simplifiée, par rapport aux algorithmes utilisés. En fait, la description est équivalente au code, et la différence sert simplement à rendre la description plus accessible).
Pour les requêtes administratives telles que shutdown, reload, etc..., le serveur ne vérifie les droits que dans la table user
, étant donné que c'est la seule qui spécifie les droits administratifs. La commande est exécutée si les droits sont disponibles, et sinon, la requête n'est pas autorisée. Par exemple, si vous voulez exécuter mysqladmin shutdown
mais que votre compte utilisateur dans la table user
n'a pas les droits de shutdown, l'autorisation n'est aps donnée, sans même vérifier les tables db
ou host
. (Etant donné que ces tables ne contiennent pas de colonne Shutdown_priv
, il n'y a pas besoin de passer en revue ces tables.)
Pour les requêtes liées aux bases de données, telles que insert, update, etc., le serveur commence par vérifier les droits globaux (droits de super utilisateur) en recherchant dans la table user
. Si il trouve des droits, l'exécution de la requête est autorisé. Si les droits globaux sont insuffisants, le serveur détermine les droits spécifiques à cette base en vérifiant les tables db
et host
:
- Le serveur dans la table
db
une ligne qui corresponde à Host
, Db
et User
de l'utilisateur. Host
et User
ont été défini lors de la connexion au serveur. Le champs Db
prendre le nom de la base de données qui va être modifiée. Si il n'y a aucune entrée, l'autorisation n'est pas donnée.
- Si il y a une ligne, et que le champs
Host
n'est pas laissé vide, cette ligne définit les droits de l'utilisateur, spécifiques à cette base.
- Si le champs
Host
a été laissé vide, cela signifie que la table host
contient la liste des hôtes qui ont l'autorisation d'accéder à cette base. Dans ce cas, une nouvelle recherche est effectuée dans la table host
pour rechercher une ligne qui correspondent à Host
et Db
. Si aucune ligne n'est trouvée, alors l'accès n'est pas autorisé. Si une ligne est trouvée, les droits d'accès de cet utilisateur sont représentés par l'intersection des droits issus de la table db
et de la table host
, i.e., c'est à dire les droits qui sont à 'Y'
dans les deux lignes trouvées. (De cette manière, vous pouvez donner des droits généraux, et restreindre sélectivement en fonction des hôtes, grce à la table host
.)
Après avoir déterminé les droits spécifiques à la base de données, avec les tables db
et host
, le serveur les ajoutent aux droits globaux donnés par la table user
. Si le résultat de cette union autorise l'opération, la requête est exécutée. Sinon, le serveur vérifie les droits sur les tables et les colonnes dans les tables tables_priv
et columns_priv
et les ajoutent aux droits de l'utilisateur. l'accès est alors donné ou retiré en fonction du résultat.
Exprimé par une formule booléenne, la description précédente du calcul des droits est la suivante :
global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges
Il n'est pas évident que si les droits globaux user
sont insuffisants pour l'opération demandée, le serveur va les ajouter dans les différentes tables qui conservent les droits. La raison est qu'une requête peut nécessiter plusieurs droits différents. Par exemple, la commande INSERT ... SELECT
requiert les droits d'insertion (insert) et de selection (select). Il se peut alors que les droits d'insertion soient disponible au niveau de la table, et que les droits de selection soient au niveau de la colonne. Dans ce cas, les droits de deux niveaux doivent être combinés pour autoriser la commande. D'où cette propagation de droits.
La table host
est utilisée pour avoir une liste de serveurs ``sécurisés''. A TcX, la table host
contenait la liste de toutes les machines du réseau local. Toutes ces machines avaient des autorisations d'accès sur le serveur.
Vous pouvez aussi utiliser cette table pour lister les serveurs qui ne sont pas sûrs. Par exemple, supposons que la machine public.votre.domaine
soit située dans une zone publique qui ne soient pas sûre. Vous pouvez alors accepter tous les hôtes du réseau, et exclure cette machine, comme ceci :
+----------------------+----+-
| Host | Db | ...
+----------------------+----+-
| public.votre.domaine | % | ... (tous les droits à 'N')
| %.your.domain | % | ... (tous les droits à 'Y')
+-------------------**-+----+-
Bien entendu, il est plus sage de tester toutes les lignes des tables de droits (e.g., en utilisant mysqlaccess
) pour s'assurer que les droits sont bien donnés comme vous le souhaitez.