微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Postgresql 客户端连接问题

Postgresql 客户端连接问题

bydodojava fromhttp://m.oschina.net/blog/35954

做程序调用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 的常用格式是一套记录,
每行一条。空白行行被忽略,井号( # )开头的注释也被忽略。
一条记录是由若干用空格和/或 tab 分隔的字段组成。
如果字段用引号包围,那么它可以包含空白。记录不能跨行存在。

每条记录声明一种联接类型,一个客户端 IP 地址范围(如果和联接类型相关的话),一个数据库名,一个用户名字,
以及对匹配这些参数的联接使用的认证方法
第一条匹配联接类型,客户端地址和联接企图请求的数据库名和用户名的记录将用于执行认证。
这个处理过程没有"跨越"或者"回头"的说法:如果选择了一条记录而且认证失败,
那么将不考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。

每条记录可以下面七种格式之一
local databaseuserauthentication-method[ authentication-option]
host databaseuserCIDR-addressauthentication-method[ authentication-option]
hostssl databaseuserCIDR-addressauthentication-method[ authentication-option]
hostnossl databaseuserCIDR-addressauthentication-method[ authentication-option]
host databaseuserIP-addressIP-maskauthentication-method[ authentication-option]
hostssl databaseuserIP-addressIP-maskauthentication-method[ authentication-option]
hostnossl databaseuserIP-addressIP-maskauthentication-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使用信任连接
localall 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/24md5
为了使postgresql支持TCP/IP连接,要设置监听地址行,参考内容如下:
# - Connection Settings -
listen_addresses = '*'
#port = 5432
max_connections = 100
  • 重新启动服务,现在的postgresql支持TCP/IP连接了,就可以用psql进行测试了.

原文地址:https://www.jb51.cc/postgresql/196548.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐