web-dev-qa-db-fra.com

Django: mysql: 1045, "Accès refusé à l'utilisateur

Toute la configuration fonctionne depuis des mois sur mon ordinateur local.
J'installe maintenant sur un site distant.
Crée une nouvelle base de données mysql, crée un nouvel utilisateur ("someuser") et lui octroie des droits complets, comme ci-dessous -

Accordez tous les privilèges sur. TO 'someuser' @ 'localhost' IDENTIFIÉ PAR 'un mot de passe' WITH GRANT OPTION; 

J'ai synchronisé la base de données en utilisant "python manage.py syncdb" et les tables appropriées ont été créées. Mon settings.py a le même utilisateur.

Mais lorsque j'essaie de connecter un utilisateur via l'application, et que la base de données est touchée, je vois ce qui suit dans les journaux -

(1045, "Accès refusé à l'utilisateur 'someuser' @ 'localhost' (à l'aide du mot de passe: OUI)")

Je me suis connecté via mysql (installé sur la même boîte que Django) et vérifié les subventions et il montre correctement -

Subventions pour someuser @ localhost
Accordez tous les privilèges *. * TO 'someuser' @ 'localhost' IDENTIFIÉ PAR UN MOT DE PASSE '* thesaltedpasswordOverHere' AVEC GRANT OPTION

Je ne veux pas utiliser le nom d'utilisateur/mot de passe root pour Django, car cela ne semble pas être le bon chemin.

Des indicateurs sur ce qui pourrait être faux?

23
PlanetUnknown

Je le fais comme ceci pour une base de données nommée foo_db:

create database foo_db;
create user foo_user identified by 'foo_password';
grant all on foo_db.* to 'foo_user'@'%';
flush privileges;
26
duffymo

Dans mon cas, le fichier settings.py a les caractéristiques suivantes:

    DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'NAME': 'TRYDJANGO',
        'USERNAME':'user_trydjango',
        'PASSWORD':'passtry',
        'PORT':'3306',
        'Host': 'localhost',
    }
}

Et cela fonctionne si je change le 'USERNAME' en 'USER':

    DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'NAME': 'TRYDJANGO',
        'USER':'user_trydjango',
        'PASSWORD':'passtry',
        'PORT':'3306',
        'Host': 'localhost',
    }
}
6
Maritza Esparza

Mon message d'erreur indiquait qu'il n'y avait pas de mot de passe fourni à la base de données: 

Django.db.utils.OperationalError: (1045, "Accès refusé pour l'utilisateur 'mylocalusername' @ 'localhost' (en utilisant le mot de passe: NO)")

Le manage.py devrait extraire les informations d'identification d'accès à la base de données du settings.py, qui est un utilisateur de base de données spécifique (et bien sûr, le mot de passe de cet utilisateur également). C'est une erreur de sécurité que de réagir à mon message d'erreur en accordant les privilèges de connexion à la base de données à l'utilisateur local.

Dans mon cas, il y avait des problèmes avec le settings.py (nous étions en train de restructurer notre pipeline de construction de pipeline Django à Webpack) et je devais supprimer les parties liées au pipeline de mon settings.py pour le correctif. C'est une question pour laquelle je n'ai pas reçu de message d'erreur Python à propos des problèmes settings.py, mais au lieu de cela, j'ai eu cette erreur qui n'est pas locale au problème réel. Ce message d'erreur est simplement un résultat transitif du problème source. Une fois que j'ai corrigé le manage.py, les informations d'identification ont été récupérées dans les paramètres de la base de données, comme d'habitude, et tout s'est passé sans encombre.


Dans notre cas, nous utilisions Django-pipeline avant webpack (plus précisément pip packages Django-pipeline-browserify==0.4.1 et Django-pipeline==1.6.8), donc une fois la transition effectuée, je devais simplement supprimer ces lignes des paramètres:

NODE_MODULES_BIN = '/home/myuser/sourcerepositorydir/node_modules/.bin/'
PIPELINE['SASS_BINARY'] = '/var/lib/gems/2.3.0/gems/sass-3.5.3/bin/sass'
PIPELINE['BABEL_BINARY'] = '{}{}'.format(NODE_MODULES_BIN, 'babel')
PIPELINE['BROWSERIFY_BINARY'] = '{}{}'.format(NODE_MODULES_BIN, 'browserify')
PIPELINE_BROWSERIFY_BINARY = PIPELINE['BROWSERIFY_BINARY']
PIPELINE['BROWSERIFY_ENV'] = {'NODE_ENV': 'development'}
PIPELINE['BROWSERIFY_ARGUMENTS'] = PIPELINE['BROWSERIFY_ARGUMENTS'] + ' --debug'

Jusqu'à ce que je reçois juste des messages d'erreur absurdes.

1
Csaba Toth

@ mattblang:

Dans ce cas, il est utile que l'hôte soit également défini dans le fichier settings.py réellement utilisé.

Pour moi, il s'agit de /etc/graphite/local_settings.pyDATABASES Stanzas avait une mauvaise valeur. Pour l'hôte, il y avait: 'Host': '127.0.0.1',

Parce que pendant l'exécution de la commande syncdb, elle cherchait localhost, je l'ai changée en 'Host': 'localhost',

Maintenant, ça ressemble à quelque chose comme ça:

DATABASES = {
    'default': {
        'NAME': 'graphite',
        'ENGINE': 'Django.db.backends.mysql',
        'USER': 'graphite',
        'PASSWORD': 'thepasswordyouchoose',
        'Host': 'localhost',
        'PORT': '3306'
    }
}

... et maintenant, la commande syncdbpython manage.py syncdb s'exécute correctement.

0
GeWi

Se référant à la réponse de @duffymo et modifié la dernière déclaration pourrait fonctionner pour moi.

create database foo_db;
create user foo_user identified by 'foo_password';
grant all on foo_db.* to foo_user@localhost identified by 'foo_password' with grant option;
0
ReturnHttp402

J'utilise cette config et ça marche.

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/etc/my.cnf',
        },
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
0
JoJo_wen

J'ai eu l'erreur suivante: 

ModuleNotFoundError: Aucun module nommé "MySQLdb" Django.core.exceptions.ImproperlyConfigured: Erreur lors du chargement du module MySQLdb . Avez-vous installé mysqlclient?

Solution n ° 01: Vérifiez que si votre utilisateur est autorisé à accéder à la base de données et effectuez les opérations DDL & DML sur celle-ci.

Solution n ° 02: Modification de la configuration de la base de données dans settings.py file

De:

DATABASES = {

'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'root'
    }
}

À:

DATABASES = {

'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'root',
        'PASSWORD': 'root',
        'Host': 'localhost',   # Or an IP Address that your DB is hosted on
        'PORT': '3306',
    }
}

Et ça a commencé à fonctionner.

0

Il semble que tout ce que j'ai fait est:

  1. déposer ma base de données
  2. déposer l'utilisateur
  3. recréer l'utilisateur
  4. recréer la base de données
  5. accorder à cet utilisateur, supprimer les privilèges

et puis ça commence à marcher.

0
Eric

pour autant que je sache, someuser est un utilisateur invité de la base de données et non l'admin, non?

Si tel est le cas, accordez-le à votre utilisateur administrateur de base de données MySQL pour qu'il puisse accéder à la table d'environnement MySQL 'mysql.user' comme suit:

GRANT SELECT ON mysql.user TO 'someuser' @ '%';

Pour moi cela a fonctionné, Ivan

0
Ivan Gruer

Changez également le numéro de port en "3307" si MySQl-python 64 bits est dans settings.py, Ensuite, seule la connexion aura lieu sous Windows et MySql 5.7 Django. 

'3306' pour MySQl-python 32-bit

DATABASES = {
    'default': {
        'NAME': 'graphite',
        'ENGINE': 'Django.db.backends.mysql',
        'USER': 'graphite',
        'PASSWORD': 'thepasswordyouchoose',
        'Host': 'localhost',
        'PORT': '3307'
    }
}
0
Vijay