开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21 天,点击查看活动详情
墨菲定律(Murphy's Law)
Anything that can go wrong will go wrong.
如果事情可能出错就总会出错。—— Nevil Maskelyne
Postgresql 开启远程连接
上一篇 Postgresql 文章已经在虚拟机里安装将数据库装完了,并且能够在本地连接上数据库。然而,如果这时尝试在虚拟机外用客户端连接已经启动的服务,你会发现连接被拒绝了。
这是因为 Postgresql 默认只允许本地连接,这点和 MySQL 是一致的。如果需要在本机之外进行访问,那么就需要进行配置。
这个配置文件是 /usr/local/pgsql/data/postgresql.conf。没错,就是上一篇文章我们初始化数据的文件夹目录中,这里有 Postgresql 提供的许多配置文件。比如 pg_hba.conf 是管理客户端授权配置的,以及 pg_ident.conf 当使用外部的授权系统时用于用户名映射。
首先,我们需要修改 postgresql.conf,在这里需要找到 listen_addresses 配置项,将其配置改为 '*'。
然后重启下 Postgresql 服务,就能接受外部过来的请求了。这个时候我们尝试连接下,emmmmm,发现并不行。
这是因为即使能够监听外部连接,但是还需要对用户进行授权,接下来看看 Postgresql 中的用户,角色 以及授权的方法。
Postgresql 中的用户
在PostgreSQL中,角色可以被认为是一个数据库用户,也可以被认为是一组数据库用户,这取决于角色是如何设置的。角色可以拥有数据库对象(例如,表和函数),并可以将这些对象上的特权分配给其他角色,以控制谁可以访问哪些对象。此外,还可以将角色中的成员资格授予另一个角色,从而允许成员角色使用分配给另一个角色的特权。
来看下怎么创建一个角色,以下命令是在 psql 中使用。
CREATE ROLE name; # 创建一个名字为 name 的角色
DROP ROLE name; # 删除名字为 name 的角色
用户管理的命令也是一样需要在 psql 中执行。
createuser name; # 创建一个名字为 name 的用户
dropuser name; # 删除名字为 name 的用户
如果需要配置密码,可用下面的命令。
# 创建一个名称为 name 的角色,密码为 string
CREATE ROLE name PASSWORD 'string'
想修改现有用户密码,用 alter role 语句。来看下示例。
ALTER ROLE name password '123456'; # 将名称为 name 的角色密码设置为 123456
对用户进行授权
建立用户之后,其实还不能进行连接,需要在文件 pg_hba.conf 对用户进行授权。本地 localhost 是默认允许连接的。我们来看看它的结构。
# TYPE DATABASE USER ADDRESS METHOD
各个字段解释如下。
- type:代表授权的连接类型,可选的值有
- local:使用 unix 文件进行连接
- host:使用 TCP/IP socket 进行连接
- hostnossl:不采用双向加密的 TCP/IP socket 进行连接
- hostssl:采用双向加密的 TCP/IP socket 进行连接
- hostgssenc:采用 GSSAPI-encrypted 对 TCP/IP socket 进行加密
- hostnogssenc:不采用 GSSAPI-encrypted 对 TCP/IP socket 进行加密
- database:授权的操作的数据库
- user:授权的用户
- ADDRESS:授权连接的地址
- METHOD:代表授权方法,可选项有
trust、reject、md5、passwordscram-sha-256、gss、sspi、ident、peer、pam、ldap、radius、cert。其中trust代表绝对信任,只要其它字段能命中就可以连接,而password则需要填写用户名和密码,能够匹配才能连接成功。
来看个示例。
# TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.56.0/24 password
上面的配置代表连接类型为 tcp 连接,对所有用户以及数据库,在连接地址为 192.168.56.0/24 时,需要用密码进行连接。
这样,Postgresql 就可以使用用户进行远程登录了。