se connecter à une firebase database en utilisant psycopg2 sans mot de passe

J’ai une firebase database postgres sur mon localhost auquel je peux accéder sans mot de passe

$ psql -d mwt psql (8.4.12) Type "help" for help. mwt=# SELECT * from vatid; id | requester_vatid |... -----+-----------------|... 1719 | IT00766780266 |... 

Je veux accéder à cette firebase database à partir de django. J’ai donc mis des DATABASES

 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'mwt', 'USER': 'shaoran', 'HOST': 'localhost' } } 

Comme je n’ai pas besoin de mot de passe pour accéder à ma firebase database de test, je n’ai pas fourni de valeur de PASSWORD de PASSWORD dans les parameters.

 $ ./manage.py shell >>> from polls.models import Vatid >>> Vatid.objects.all() connection_factory=connection_factory, async=async) OperationalError: fe_sendauth: no password supplied 

J’ai essayé d’utiliser PASSWORD: '' mais j’ai le même message d’erreur. J’ai essayé d’utiliser PASSWORD: None mais cela n’a pas aidé non plus.

J’ai recherché la documentation de Django à ce sujet mais je ne trouve rien d’utile. Il est possible de configurer django.db.backends.postgresql_psycopg2 pour accepter un mot de passe vide?

Vérifiez votre pg_hba.conf pour permettre la connexion de localhost par l’utilisateur shaoran , puis fournissez le mot de passe de shaoran dans les parameters de Django ou faites confiance à l’utilisateur dans pg_hba.conf

Le fait que vous puissiez vous connecter via psql est dû au fait que psql -d mwt utilise des valeurs de connexion par défaut définies comme fiables dans pg_hba.conf . Par exemple, sur ma machine, l’hôte par défaut est local socket au lieu de localhost

Étonnamment, la réponse est de ne pas spécifier d’hôte du tout. Si tu fais ça,

 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'mwt', } } 

Ensuite, psycopg2 se connectera en utilisant un socket Unix de la même manière que psql . Lorsque vous spécifiez un HOST , psycopg2 se connecte avec TCP / IP, ce qui nécessite un mot de passe.

Pour éviter d’utiliser un mot de passe dans Django settings.py changez md5 pour lui trust dans cette ligne de pg_hba.conf :

 host all all 127.0.0.1/32 trust 

Pour une compréhension détaillée des configurations de sécurité postgres, lisez ce document.

Pour localiser ce fichier:

 sudo -u postgres psql -c 'SHOW hba_file;' 

En tant que personne confrontée au même problème et ne trouvant qu’une solution après avoir combiné différentes parties des réponses présentes et d’autres résultats d’essais Google, j’ai décidé de préparer une réponse complète :

Première chose à noter :

Le fait de mettre 'HOST' ou de l’omettre dans settings.py sont des options viables. Cependant, si vous placez 'HOST' ou non, cela affectera la configuration de la configuration postgresql.

Si vous omettez 'HOST' comme dans la réponse de joerick, psycopg2 tente de se connecter via un socket de domaine Unix. En revanche, si votre configuration contient la clé 'HOST' , psycopg2 tentera de se connecter via IPv4 / 6 localhost . Cela fait une grande différence car la configuration de l’authentification postgresql ( /etc/postgresql/xx/main/pg_hba.conf ) est spécifique à l’une de ces manières de se connecter.

Prendre le message à la maison:

Veillez à choisir le type de connexion que vous avez également configuré dans votre configuration d’authentification postgresql.

Deuxième chose à noter:

La configuration de l’authentification postgresql ( /etc/postgresql/xx/main/pg_hba.conf ) concerne l’ordre des entrées.

Les docs sont en fait très clairs à ce sujet ( pourtant, j’ai réussi à tomber dans le piège de local all all peer ):

Le premier enregistrement avec un type de connexion, une adresse client, une firebase database demandée et un nom d’utilisateur correspondants est utilisé pour effectuer l’authentification. Il n’y a pas de “fall-through” ou “backup”: si un enregistrement est choisi et que l’authentification échoue, les enregistrements suivants ne sont pas pris en compte. Si aucun enregistrement ne correspond, l’access est refusé.

Prendre le message à la maison:

Assurez-vous que toute règle spécifique vient avant des règles plus larges.


Maintenant que nous soaps tout cela, voici comment obtenir un access sans mot de passe, une fois avec 'HOST' (donc plus localhost ) et une fois sans (donc sur un socket Unix) .


Connexion via localhost

Spécifiez 'HOST': 'localhost' dans la configuration de firebase database de vos settings.py :

 # ... 'HOST': 'localhost', # ... 

'PASSWORD' n’est pas nécessaire et peut être omis.

La règle à définir dans votre configuration d’authentification postgresql ( /etc/postgresql/xx/main/pg_hba.conf ) concerne l’ host TYPE.

Attention à l’ordre des règles. Donc, si vous avez un utilisateur “my_user” qui devrait pouvoir accéder à la firebase database “my_database” sans mot de passe, une configuration correcte ressemblerait à ceci:

 # RIGHT WAY... host my_database my_user 127.0.0.1/32 trust host my_database my_user ::1/128 trust # ... host all all 127.0.0.1/32 peer # ... 

Inverser la commande entraînera une erreur no password supplied .


Connexion via un socket de domaine Unix

Ne mettez pas la touche 'HOST' dans vos parameters. 'PASSWORD' n’est pas nécessaire non plus.

Dans la configuration d’authentification postgresql, l’access aux sockets de domaine Unix est géré avec les règles de TYPE local .

Si “my_user” doit avoir un access sécurisé (pas de mot de passe requirejs) à une firebase database “my_database”, vous avez besoin d’une ligne comme celle-ci:

 local my_database my_user trust 

Concernant l’emplacement de cette ligne, la règle est que vous devez la mettre avant toute règle plus large en termes de DATABASE et USER . Pour être sûr, je recommande de le mettre au début de /etc/postgresql/xx/main/pg_hba.conf . Si votre fichier pg_hba.conf ressemble à ceci:

 # RIGHT WAY... local my_database my_user trust # ... local all all peer # ... 

vous êtes bon pour aller sans mot de passe. Cependant, si cela ressemble à ceci:

 # WRONG WAY! ... local all all peer # ... local my_database my_user trust # ... 

vous devrez fournir un mot de passe.


Note finale:

N’oubliez pas de redémarrer le service postgresql après modification de /etc/postgresql/xx/pg_hba.conf :

 sudo service postgresql restart 

J’espère que c’était utile. Heureux codage!

Je vis avec «tous les pairs locaux» seulement. La chaîne de connexion doit être sans hôte, utilisateur et mot de passe: postgres: /// mydbname.

Sans le module environ, il a l’air de:

 DATABASES = { 'default': {'NAME': 'mydatabase', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', 'ENGINE': 'django.db.backends.postgresql_psycopg2'} } 

Avec le module environ:

 import environ env = environ.Env() DATABASES = { 'default': env.db('DATABASE_URL', default='postgres:///mydatabase'), } 

où le fichier .env ne contient aucun paramètre DATABASE_URL.

Seulement pour l’utilisateur ‘postgres’ j’utilise md5, mais uniquement à partir de psql / pgadmin3, pas à partir du code django.

 # /etc/postgresql/version/cluster/pg_hba.conf: local all postgres md5 local all all peer