Postgresql 客户端连接问题

来源:互联网 发布:p2p网络借贷的起源 编辑:程序博客网 时间:2024/05/16 08:26
   做程序调用postgresql数据库的时候,后台出现这么一条错误:

    java.sql.SQLException: No pg_hba.conf entry for host 210.230.203.160, user postgres, database rinri01

  这条错误是什么意思?为什么会出现呢?
  
   这条错误的原因是因为客户端远程访问postgresql受限所致,因为postgresql默认情况下除本机外的机器是不能连接的,下

面我们就来分析并解决这个问题:

   默认情况下,postgresql本机的连接是信任连接,只要有用户名就可以连接,不用密码. 要改变这种默认设置需要更改

postgresql的两个配置文件(pg_hba.conf与postgresql.conf,这两个文件在initdb时指定的目录下,如:/usr/local/pgsql

/data
(unix), windows系统时直接在postgresql的根目录的data目录下)
  • pg_hba.conf文件内容:
        文件 pg_hba.conf 的常用格式是一套记录,
        每行一条。空白行行被忽略,井号( # )开头的注释也被忽略。
        一条记录是由若干用空格和/或 tab 分隔的字段组成。
        如果字段用引号包围,那么它可以包含空白。记录不能跨行存在。
  
        每条记录声明一种联接类型,一个客户端 IP 地址范围(如果和联接类型相关的话),一个数据库名,一个用户名字,
        以及对匹配这些参数的联接使用的认证方法。
        第一条匹配联接类型,客户端地址和联接企图请求的数据库名和用户名的记录将用于执行认证。
        这个处理过程没有"跨越"或者"回头"的说法:如果选择了一条记录而且认证失败,
        那么将不考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。
   
        每条记录可以下面七种格式之一
local      database  user  authentication-method  [authentication-option]
host       database  user  CIDR-address  authentication-method[authentication-option]
hostssl    database  user  CIDR-address  authentication-method  [authentication-option]
hostnossl  database  user  CIDR-address  authentication-method  [authentication-option]
host       database  user  IP-address  IP-mask  authentication-method  [authentication-option]
hostssl    database  user  IP-address  IP-mask  authentication-method  [authentication-option]
hostnossl  database  user  IP-address  IP-mask  authentication-method  [authentication-option]

        各个字段的含义如下:
   
local
        这条记录匹配通过 Unix 域套接字进行的联接企图。
        没有这种类型的记录,就不允许 Unix 域套接字的联接。
      
host
        这条记录匹配通过 TCP/IP 进行的联接尝试。
        host 记录匹配 SSL 和非 SSL 的连接请求。
      
注意:        除非服务器带着合适的
[url=file:///mnt/usbg/lyb/books/postgresql/postgres8.0.zh_cn/runtime-config.html#GUC-LISTEN-ADDRESSES]listen_addresses[/url]
配置参数值启动,否则将不可能进行远程的 TCP/IP 连接,
       因为缺省的行为是只监听本地自环地址 localhost 的连接。
      
hostssl
        这条记录匹配使用 TCP/IP 的 SSL 联接企图。
        但必须是使用 SSL 加密的联接。
      
        要使用这个选项,制作服务器的时候必须打开 SSL 支持。而且在服务器启动的时候,
        必须SSL选项通过配置选项
[url=file:///mnt/usbg/lyb/books/postgresql/postgres8.0.zh_cn/runtime-config.html#GUC-SSL]ssl[/url]
打开。
      
hostnossl
           这个记录与 hostssl 有着正相反的逻辑:
           它只匹配那些在 TCP/IP 上不使用 SSL 的连接请求。
      
database
        声明记录所匹配的数据库。值
        all 表明该记录匹配所有数据库,
        值 sameuser表示如果被请求的数据库和请求的用户同名,则匹配。
        samegroup 表示请求的用户必须是一个与数据库同名的组中的成员。
        在其他情况里,这就是一个特定的 PostgreSQL 的名字。
        我们可以通过用逗号分隔的方法声明多个数据库。
        一个包含数据库名的文件可以通过对该文件前缀 @ 来声明。
      
user
        为这条记录声明所匹配的PostgreSQL用户。值 all 表明它匹配于所有用户。
        否则,它就是特定 PostgreSQL
        用户的名字。多个用户名可以通过用逗号分隔的方法声明。组名字可以通过用 + 做组名字前缀来声明。
        一个包含用户名的文件可以通过在文件名前面前缀 @ 来声明。该文件必需和
        pg_hba.conf 在同一个目录。
      
CIDR-address
       声明这条记录匹配的客户端机器的 IP 地址范围。它包含一个标准的点分十进制的 IP 地址和一个 CIDR 掩码长度。
       (IP 地址只能用数值声明,不能用域或者主机名。)
       掩码长度表示客户端 IP 地址必须匹配的高位二进制位数。
       在给出的 IP 地址里,这个长度的右边的二进制位必须为零。
       在 IP 地址,/,和 CIDR 掩码长度之间不能有空白。
      
       典型的 CIDR 地址是 172.20.143.89/32,这表明一个主机,
       或者 172.20.143.0/24 表示一个网络。
       要声明单个主机,给 IPv4 地址声明 CIDR 掩码 32,给 IPv6 地址声明 128。
      
       以 IPv4 格式给出的 IP 地址会匹配那些拥有对应地址的 IPv6 连接,比如
       127.0.0.1 将匹配 IPv6 地址 ::ffff:127.0.0.1。
       一个以 IPv6 格式给出的记录将只匹配 IPv6 连接,即使对应的地址在 IPv4-in-IPv6
       范围内。请注意如果系统的 C 库不支持 IPv6 地址,那么 IPv6 的格式将被拒绝。
      
        这个域只适用于 host,hostssl 和 hostnossl 记录。
      
IP-address
IP-mask
       这些方法可以用于作为 CIDR-address 表示法的替补。
       它不是声明掩码的长度,而是在另外一个字段里声明实际的掩码。
       比如,255.0.0.0 表示 IPv4 CIDR 掩码长度 8,而 255.255.255.255 表示 CIDR 掩码长度 32。
       同样的匹配逻辑将用于一个点分的 IP-mask
      
       这些字段只适用于 host, hostssl,
       和 hostnossl 记录。
      
authentication-method(认证方法)
        声明通过这条记录联接的时候使用的认证方法。
      
trust
        无条件地允许联接。这个方法允许任何可以与PostgreSQL
        数据库服务器联接的用户以他们期望的任意
        PostgreSQL 数据库用户身份进行联接,而不需要口令。
         
reject
        联接无条件拒绝。常用于从一个组中"过滤"某些主机。
         
md5
        要求客户端提供一个 MD5 加密的口令进行认证。
crypt
        要求客户端提供一个 crypt() 加密的口令用于认证。
        7.2 以前的客户端只能支持 crypt。
        对于 7.2 以及以后的客户端,我们建议使用 md5。
password
        要求客户端提供一个未加密的口令进行认证。
        因为口令是以明文形式在网络上传递的,
        所以我们不应该在不安全的网络上使用这个方式。
         
krb4
        用 Kerberos V4 认证用户。只有在进行 TCP/IP 联接的时候才能用。
         
krb5
        用 Kerberos V5 认证用户。只有在进行 TCP/IP 联接的时候才能用。
ident
        获取客户的操作系统名(对于 TCP/IP 联接,用户的身份是通过与运行在客户端上的
        ident 服务器联接进行判断的,对于本地联接,它是从操作系统获取的。)
        然后检查一下,看看用户是否允许以要求的数据库用户进行联接,
        方法是参照在 ident 关键字后面声明的映射。
pam
        使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules)
我的配置示例如下:
# 本机localhost使用信任连接
local  all    all                       trust
#127.0.0.1与192.168.1.0~254段IP地址访问时需要口令验证
#要让本机外的机器访问,除了在这设置外还要把postgresql.conf
#里的监听地址设置为:listen_addresses = '*'
host    all     all     127.0.0.1/32    md5
host    all     all     192.168.1.0/24  md5
  • postgresql.conf文件内容
    为了使postgresql支持tcp/ip连接,要设置监听地址行,参考内容如下:
# - Connection Settings -
listen_addresses = '*'         
#port = 5432
max_connections = 100
  • 重新启动服务,现在的postgresql就支持tcp/ip连接了,就可以用psql进行测试了.