【问题标题】:connect to a DB using psycopg2 without password使用 psycopg2 无密码连接到数据库
【发布时间】:2012-06-26 20:58:11
【问题描述】:

我的本​​地主机上有一个 postgres 数据库,无需密码即可访问

$ psql -d mwt
psql (8.4.12)
Type "help" for help.

mwt=# SELECT * from vatid;
  id   | requester_vatid |...
  -----+-----------------|...   
  1719 | IT00766780266   |...

我想从 django 访问该数据库。所以我输入了DATABASES

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

由于我不需要密码来访问我的测试数据库,因此我没有在设置中提供任何 PASSWORD 值。

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

我尝试使用PASSWORD: '',但收到相同的错误消息。我尝试使用PASSWORD: None,但这也无济于事。

我一直在搜索有关此的 django 文档,但找不到任何有用的东西。可以配置django.db.backends.postgresql_psycopg2接受空密码吗?

【问题讨论】:

  • 您可以通过 localhost 或 Unix 域套接字进行配置。 Here 解释了这两种情况的工作原理。
  • @jojo 非常感谢您的评论。很久以前,我什至不记得我做了什么来修复它,反正这个项目早就死了。
  • 希望它对其他人有用!与上述项目相反,这种配置的潜​​在缺陷仍然存在,这两个事实都令人遗憾。
  • @jojo 基于对所有答案和问题的赞成票数,这个问题肯定也帮助了其他人。现在我记得,问题是(正如你在回答中所说)我使用了HOST 参数。

标签: python django postgresql psycopg2


【解决方案1】:

令人惊讶的是,答案是根本不指定主机。如果你这样做,

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

然后 psycopg2 将以与psql 相同的方式使用 Unix 套接字进行连接。当您指定HOST 时,psycopg2 将使用 TCP/IP 连接,这需要密码。

【讨论】:

  • 对我来说仍然失败:django.db.utils.OperationalError: FATAL: Peer authentication failed for user "www-data";必须在 hba.conf before 中添加 local all www-data trust 默认 local all postgres peer 行。
  • @jcomeau_ictx I added a complete explanation 这是如何通过 Unix 域(如本答案中隐含的建议)以及通过 localhost 建议的 the accepted answer 工作的。
  • 在将 postgres 设置为信任后,我可以使用 PGAdmin 登录,但 Django 仍然无法建立连接并引发 fe_authentication 错误。只有这个解决方案有效!谢谢!
【解决方案2】:

为了避免在 Django 中使用密码 settings.pymd5 更改为 trustpg_hba.conf 这一行中:

host    all             all             127.0.0.1/32            trust

如需详细了解 postgres 安全配置,请阅读this doc.

要找到这个文件:

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

【讨论】:

    【解决方案3】:

    检查您的pg_hba.conf 以允许用户shaoranlocalhost 连接,然后在Django 设置中提供shaoran 的密码或信任pg_hba.conf 中的用户

    您可以通过psql 进行连接是因为psql -d mwt 使用了一些在pg_hba.conf 中设置为受信任的默认连接值。例如,在我的机器上,默认主机是local socket,而不是localhost

    【讨论】:

    • 我不认为这是 pg_hba.conf 的问题。实际上,这个 mwt 数据库用于 rails 应用程序,我没有在我的 rails 配置中指定任何用户名或任何密码,并且我对 rails 访问我的数据库没有任何问题。我的 Rails 配置文件是:# config/database.yml 开发:适配器:postgresql 数据库:mwt 我对 django 很陌生,我想快速测试多个数据库连接,这就是为什么我尝试使用我已经拥有的数据库在我的系统上。
    • @Pablo 这里的关键是你指定了host=localhostuser=shaoran,这可能与psqlRails使用的DSN不同
    • Upps,我没有意识到代码块在注释字段中不起作用。无论如何,我犯了一个巨大的错误,因为我当前的用户@work 是yanez 而不是shaoran(我的用户@home)。我将 USER 更改为“yanez”,但仍然出现相同的错误。我什至从 settings.py 中删除了 USER 条目,以便配置与 rails 之一匹配,但我仍然收到该错误:(
    • @Pablo 我不知道 Rails 是如何处理这个问题的,Django 有 own defaults
    • 感谢您的帮助。除了用户名错误的愚蠢错误之外,这里的问题是 host 条目。我假设没有它 psql、rails 和 psycopg2 通过文件套接字而不是网络套接字访问本地数据库。
    【解决方案4】:

    作为一个面临同样问题的人,并且只有在结合此处提供的答案的各个部分和 google-ing 试验的其他发现后才找到解决方案,我决定整理一个有希望的完整答案

    首先要注意

    'HOST' 或在settings.py 中省略都是可行的选择。 但是,是否输入'HOST' 会影响您必须如何设置 postgresql 配置。

    joerick's answer 中省略'HOST' 会导致psycopg2 尝试通过Unix 域套接字进行连接。另一方面,如果您的配置包含'HOST' 键,psycopg2 将尝试通过 IPv4/6 localhost 连接。这会产生很大的不同,因为 postgresql 身份验证配置 (/etc/postgresql/x.x/main/pg_hba.conf) 特定于这些连接方式中的任何一种。

    带回家留言:

    确保选择您也在 postgresql 身份验证配置中配置的连接类型。

    要注意的第二件事:

    postgresql 身份验证配置 (/etc/postgresql/x.x/main/pg_hba.conf) 关心条目的顺序。

    The docs其实很清楚这一点,(但我还是掉进了local all all peer的陷阱):

    first 记录具有匹配的连接类型、客户端地址、请求的数据库和用户名,用于执行身份验证。没有“fall-through”或“backup”:如果选择了一条记录并且认证失败,则不考虑后续记录。如果没有记录匹配,则拒绝访问。

    带回家留言:

    确保任何特定规则出现在更广泛的规则之前。


    现在我们知道了所有这些,这里是如何在没有密码的情况下获得访问权限,一次使用'HOST'(所以超过localhost)和一次没有密码(所以通过 Unix 套接字)


    通过localhost 连接

    settings.py的数据库配置中指定'HOST': 'localhost'

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

    'PASSWORD' 不需要,可以省略。

    您需要在 postgresql 身份验证配置 (/etc/postgresql/x.x/main/pg_hba.conf) 中设置的规则是 TYPE host

    注意规则的顺序。因此,如果您的用户“my_user”应该能够在没有密码的情况下访问数据库“my_database”,那么正确的配置应该如下所示:

    # 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
    # ...
    

    颠倒排序将导致no password supplied 错误。


    通过 Unix 域套接字连接

    不要将'HOST' 键放在您的设置中。 'PASSWORD' 也不需要。

    在 postgresql 身份验证配置中,通过 Unix 域套接字的访问由 TYPE local 规则管理。

    如果“my_user”应该获得信任(无需密码)访问数据库“my_database”,您需要这样一行:

    local my_database my_user trust
    

    关于将这一行放在哪里,这里的规则是您需要将它放在任何更广泛 规则之前,就DATABASEUSER 而言。为了安全起见,我建议将其放在/etc/postgresql/x.x/main/pg_hba.conf开头。如果您的 pg_hba.conf 文件如下所示:

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

    不用密码就可以了。但是,如果它看起来像这样:

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

    您需要提供密码。


    最后说明:

    修改/etc/postgresql/x.x/pg_hba.conf后别忘了重启postgresql服务

    sudo service postgresql restart
    

     

             希望这对您有所帮助。编码愉快!

    【讨论】:

      【解决方案5】:

      我只与“本地所有所有同行”一起生活。连接字符串应该没有主机、用户和密码:postgres:///mydbname。

      没有 environ 模块,它看起来是这样的:

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

      使用环境模块:

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

      .env 文件不包含 DATABASE_URL 设置。

      仅对于用户 'postgres' 我使用 md5,但仅来自 psql/pgadmin3,而不来自 django 代码。

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

      【讨论】:

        猜你喜欢
        • 2019-12-14
        • 2016-07-31
        • 1970-01-01
        • 1970-01-01
        • 2019-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多