如果你是第一次玩postgresql数据库,你会发现你给role或者user明明设置了密码,但在登录的时候毛都不用输入,直接就进去了,怎么那么爽快!?
虽然爽快,但貌似不该这样啊.
其实这些都和一个重要的文件有关,它就是pg_hba.conf!
那么这个文件在哪呢?如果你是mac或是linux系统,你可以通过如下方式找到这个文件:
ps aux|grep postgres
//你会发现输出其中有-D的一行
apple 70988 0.0 0.2 2604888 8884 s001 S 2:05下午 0:00.54 /usr/local/Cellar/postgresql/9.4.4/bin/postgres -D /usr/local/var/postgres
上面-D后面就是pg_hba.conf的位置所在,用编辑器打开它,你会发现其中包含了详细的说明文档.如果你不想鸟这些东东,你只要知道每一条都是一条策略,说明了访问那些位置需要什么样的认证方式,比如:
local all all trust
说明了所有本地访问都是受到信任的,在认证时是不需要输入密码的,像trust这一列称为method,有很多种method,比如:
"trust", "reject", "md5", "password", "gss", "sspi",
"ident", "peer", "pam", "ldap", "radius" or "cert"
有兴趣的可以自行进一步研究下,那么如果我希望在本地登录统统需要输入密码,你只要吧local最后的method改为password即可.你当然可以制定更加具体一点的策略:
host db_name user_name 10.10.10.1 password
比如以上策略表示通过socket连接,使用用户user_name访问地址10.10.10.1上的数据库db_name需要输入密码!
ok!现在通过psql登录本地任何数据库都需要输入密码啦,但是通过gui工具pgadmin登录还是不需要密码,我们还需要修改另2条策略:
# IPv4 local connections:
#host all all 127.0.0.1/32 password
# IPv6 local connections:
#host all all ::1/128 password
因为pgadmin不是通过local来登录postgresql的.你还可以设置一条策略,就是所有通过网络来访问的都要输入密码:
host all all samehost password
其中samehost代码任何host地址.
最后还要说另一个文件.pgpass,这个文件的目的是如果登录时需要输入密码,那么你可以把对应的密码写在这里,这样你就可以直接登录了.
该文件是在用户的home目录中,也可能开始并不存在,需要手动创建:
touch ~/.pgpass
chmode 0600 ~/.pgpass
后面一句是postgresql所要求的,增加安全性.
比如test用户的密码为pwd,则我们可以在.pgpass文件中增加一行:
*:5432:*:test:pwd
那么用test用户访问任何地址的任何数据库(通过5432端口)都不需要手动输入密码了,但是其它用户还是需要输入密码的.