Lorsque vous tentez de vous connecter au serveur MySQL, le serveur accepte ou rejette la connexion en fonction de votre identité et du mot de passe que vous fournissez. Si le mot de passe ne correspond pas à celui qui est en base, le serveur vous interdit complètement l'accès. Sinon, le serveur accepte votre connexion et passe à l'étape 2, et la gestion de commandes.
Votre identité est basée sur trois informations :
L'hôte depuis lequel vous vous connectez
Votre nom d'utilisateur MySQL
        La vérification d'identité est réalisée avec les trois
        colonnes de la table user
        (Host, User et
        Password). Le serveur accepte la connexion
        uniquement si une entrée dans la table user
        correspond à votre hôte, et que vous fournissez le mot de
        passe qui correspond.
      
        Les valeurs de la table user peuvent être
        paramétrées comme ceci :
      
            Une valeur de la colonne Host peut être
            un nom d'hôte, une adresse IP numérique, ou encore
            'localhost', qui représente l'hôte
            local.
          
            
            Vous pouvez utiliser les caractères jokers
            ‘%’ et
            ‘_’ dans le champ
            Host. Ces caractères ont la même valeur
            que pour les opérations de recherches avec l'opérateur
            LIKE. Par exemple, une valeur
            Host de '%' remplace
            n'importe quel nom d'hôte, alors que la valeur
            '%.mysql.com' représente tous les hôtes
            du domaine mysql.com.
          
            
            Depuis MySQL version 3.23, les valeurs de
            Host spécifiées sous la forme d'IP
            numériques peuvent être complétées avec le masque de
            réseau qui indique combien de bits d'adresse sont
            utilisés. Par exemple :
          
mysql>GRANT ALL PRIVILEGES ON db.*->TO david@'192.58.197.0/255.255.255.0';
Cela permet à toute personne se connectant depuis une adresse IP qui satisfait la contrainte suivante :
user_ip & netmask = host_ip
            C'est à dire, pour la commande GRANT
            ci-dessus :
          
client_ip & 255.255.255.0 = 192.58.197.0
            Les adresses IP qui satisfont cette condition et qui peuvent
            se connecter au serveur MySQL sont dans l'intervalle
            192.58.197.0 à
            192.58.197.255.
          
            Une valeur vide pour la colonne Host
            indique que les droits doivent être gérés avec les
            entrées de la table host qui correspond
            à l'hôte se connectant. Vous trouverez plus d'informations
            à ce sujet dans le chapitre
            Section 5.5.6, « Contrôle d'accès, étape 2 : Vérification de la requête ».
          
            Une valeur vide dans la colonne Host des
            autres tables de droits revient à '%'.
          
        Comme vous pouvez utiliser des jokers dans les valeurs IP de
        Host (par exemple,
        '144.155.166.%' pour tous les hôtes d'un
        sous-réseau), il est possible d'exploiter cette possibilité en
        appelant un hôte 144.155.166.ailleurs.com.
        Pour contrer ce type d'attaque, MySQL bloque les noms de
        domaines qui commence par des chiffres et des points. Par
        conséquent, si vous avez un hôte nommé
        1.2.foo.com, il ne sera jamais accepté par
        la colonne Host des tables de droits. Un
        caractère joker d'adresse IP peut remplacer uniquement des
        nombres d'IP, et pas un nom d'hôte.
      
        Dans la colonne User, les caractères joker
        ne sont pas autorisés, mais vous pouvez laisser cette valeur
        vide, qui acceptera tous les noms. Si la table
        user contient une connexion avec un nom
        d'utilisateur vide, l'utilisateur est considéré comme anonyme.
        Cela signifie que le nom d'utilisateur vide est utilisé pour
        les prochaines vérifications d'accès pour la durée de la
        connexion.
      
        Le champ Password peut être vide. Cela ne
        signifie pas que n'importe quel mot de passe est valable, mais
        que l'utilisateur peut se connecter sans fournir de mot de
        passe.
      
        Les valeurs non vides du champ Password
        représentent des valeurs du mot de passe chiffrées. MySQL ne
        stocke pas les mots de passe en clair, à la vue de tous. Au
        contraire, le mot de passe fourni pas l'utilisateur qui tente de
        se connecter est chiffré (avec la fonction
        PASSWORD()). Le mot de passe ainsi chiffré
        est alors utilisé entre le client et le serveur pour vérifier
        s'il est valable. Cela évite que des mots de passe en clair
        circulent entre le client et le serveur, sur la connexion. Notez
        que du point de vue de MySQL, le mot de passe chiffré est le
        vrai mot de passe, ce qui fait que vous ne devez en aucun cas le
        donner à un tiers. En particulier, ne donnez pas accès en
        lecture aux utilisateurs normaux aux tables d'administration
        dans la base mysql! A partir de sa version
        4.1, MySQL utilise un mécanisme différent pour les logins,
        mots de passes qui est sécurisé même si les paquets TCP/IP
        sont sniffés et/ou que la base de données mysql est capturée.
      
        Depuis la version 4.1, MySQL emploie une identification forte
        qui protège mieux les mots de passe durant le processus de
        connexion. Cette méthode est sécuritaire, même si les paquets
        TCP/IP sont surveillés pour que la base de données
        mysql est capturée. Le chiffrement est
        présenté dans la section Section 5.5.9, « Hashage de mots de passe en MySQL 4.1 ».
      
        Les exemples ci-dessous illustrent comment différentes
        variantes de Host et User
        dans la table user s'appliquent aux connexion
        entrantes :
      
| Hostvalue | Uservalue | Connexions autorisées | 
| 'thomas.loc.gov' | 'fred' | fred, se connectant depuisthomas.loc.gov | 
| 'thomas.loc.gov' | '' | N'importe quel utilisateur, se connectant depuis thomas.loc.gov | 
| '%' | 'fred' | fred, se connectant depuis n'importe quel hôte | 
| '%' | '' | N'importe quel utilisateur, se connectant depuis n'importe quel hôte | 
| '%.loc.gov' | 'fred' | fred, se connectant depuis n'importe quel hôte dans
                le domaineloc.gov | 
| 'x.y.%' | 'fred' | fred, se connectant depuisx.y.net,x.y.com,x.y.edu,
                etc. (Ceci n'est probablement pas très utilisé) | 
| '144.155.166.177' | 'fred' | fred, se connectant depuis l'hôte d'IP144.155.166.177 | 
| '144.155.166.%' | 'fred' | fred, se connectant depuis un hôte d'IP dans la
                classe C144.155.166 | 
| '144.155.166.0/255.255.255.0' | 'fred' | Identique à l'exemple précédent | 
        Comme vous pouvez utiliser des caractères jokers dans les
        adresses IP de la colonne Host (par exemple,
        '144.155.166.%' pour identifier tout un
        sous-réseau), il est possible d'exploiter cette fonctionnalité
        en nommant un hôte 144.155.166.kekpart.com.
        Pour contrer de telles tentatives, MySQL interdit les
        caractères jokers avec les noms d'hôtes qui commencent par des
        chiffres ou des points. Par exemple, si vous avez un nom d'hôte
        tel que 1.2.foo.com, il ne sera jamais
        trouvé dans la colonne Host des tables de
        droits. Seule une adresse IP numérique peut être comparée
        avec un masque à caractère joker.
      
        Une connexion entrante peut être identifiée par plusieurs
        entrées dans la table user. MySQL résout ce
        problème comme ceci :
      
            Lorsque le serveur lit la table user en
            mémoire, il trie les lignes.
          
Lorsqu'un client tente de se connecter, le serveur lit les lignes dans l'ordre.
Le serveur utilise la première ligne qui correspond au nom du client et à son nom d'utilisateur.
        Supposons que votre table user ressemble à
        ceci :
      
+-----------+----------+- | Host | User | ... +-----------+----------+- | % | root | ... | % | jeffrey | ... | localhost | root | ... | localhost | | ... +-----------+----------+-
        Lorsque le serveur lit cette table, il ordonne les lignes depuis
        les valeurs les plus spécialisées de la colonne
        Host jusqu'aux plus générales
        ('%' dans la colonne Host
        signifie ``tous les hôtes'' et elle est la moins spécifique).
        Les entrées identiques dans la colonne Host
        sont ordonnées en fonction de la spécificité des valeurs de
        la colonne User (une entrée vide dans la
        colonne User signifie ``n'importe quel
        utilisateur'' et est spécifique). Le résultat de ce tri donne
        quelque chose comme ceci :
      
+-----------+----------+- | Host | User | ... +-----------+----------+- | localhost | root | ... | localhost | | ... | % | jeffrey | ... | % | root | ... +-----------+----------+-
        Lorsqu'une connexion est en cours de mise en place, le serveur
        regarde dans cette liste, et utilisera la première entrée
        trouvée. Pour une connexion depuis l'hôte
        localhost avec le nom d'utilisateur
        jeffrey, les entrées
        'localhost' dans la colonne
        Host sont trouvées en premier. Parmi
        celles-la, la ligne avec un utilisateur vide satisfait les deux
        contraintes sur le nom et l'hôte.
        '%'/'jeffrey' pourrait avoir fonctionné,
        mais comme ce n'est pas le premier rencontré, il n'est pas
        utilisé.
      
        Voici un autre exemple. Supposons que la table
        user ressemble à ceci :
      
+----------------+----------+- | Host | User | ... +----------------+----------+- | % | jeffrey | ... | thomas.loc.gov | | ... +----------------+----------+-
La table triée ressemble à ceci :
+----------------+----------+- | Host | User | ... +----------------+----------+- | thomas.loc.gov | | ... | % | jeffrey | ... +----------------+----------+-
        Une connexion depuis l'hôte thomas.loc.gov
        avec jeffrey satisfait les conditions de la
        première ligne, tandis qu'une connexion depuis
        whitehouse.gov avec
        jeffrey satisfait la seconde ligne.
      
        Une erreur commune est de penser que pour un utilisateur donné,
        toutes les entrées qui utilisent explicitement ce nom seront
        utilisées en premier lorsque la connexion est en cours
        d'établissement. Ceci est tout simplement faux. L'exemple
        précédent illustre cette situation, car la connexion depuis
        l'hôte thomas.loc.gov avec
        jeffrey est la première ligne qui est
        trouvée, alors que la ligne contenant
        'jeffrey' dans la colonne
        User est ignorée, car il n'y a pas de nom
        d'utilisateur.
      
        Si vous arrivez à vous connecter au serveur, mais que les
        droits ne sont pas ce que vous attendez, vous vous êtes
        probablement identifié avec un autre compte. Pour savoir quel
        compte le serveur utilise lors de votre identification, utilisez
        la fonction CURRENT_USER(). Elle retourne la
        valeur au format user_name@host_name qui
        indique les valeurs des colonne User et
        Host de la table user qui
        vous est affectée. Supposons que jeffrey se
        connecte et utilise la requête suivante :
      
mysql> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| @localhost     |
+----------------+
        Le résultat affiché ci-dessus indique que la ligne de la table
        user est l'utilisateur
        User vide. En d'autres termes, le serveur
        traite jeffrey comme un utilisateur anonyme.
      
        La fonction CURRENT_USER() est disponible
        depuis MySQL 4.0.6. See Section 12.8.3, « Fonctions d'informations ».
        Une autre piste à explorer : imprimez le contenu de la table
        user et triez la manuellement pour voir
        quelle est la première ligne qui est utilisée.
      
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

