如果服务器在使用dblink时未请求密码,则非超级用户无法连接

vch*_*tta 14 postgresql

我想在我的应用程序中做一些跨数据库引用.简而言之,我有两个名为meta和op的数据库.我想做一些选择查询从元数据库到op数据库中的表,如下所示,但得到以下错误.我尝试使用密码而没有密码.顺便说一句,caixa用户是非超级用户和我的目标服务器(op数据库服务器具有MD5身份验证模式.)

meta=> select * from dblink('dbname=op password=caixa','SELECT op_col from op_table') AS t(op_col varchar);
Run Code Online (Sandbox Code Playgroud)

错误:需要密码

详细信息:如果服务器未请求密码,则非超级用户无法连接.

提示:必须更改目标服务器的身份验证方法.

上面的错误消息中的提示是什么意思?我需要更改服务器的身份验证模式吗?在不更改服务器的auth模式(MD5)的情况下,我无法运行上述查询?

Grz*_*ski 14

来自文档:

只有超级用户可以使用dblink_connect创建非密码验证的连接.如果非超级用户需要此功能,请改用dblink_connect_u.

dblink_connect_u()与dblink_connect()完全相同,只是它允许非超级用户使用任何身份验证方法进行连接.

这意味着您的dblink呼叫是dblink_connect隐式使用的.请dblink_connect_u改为使用或更改您的身份验证方法,例如md5.

请注意,您还需要对caixa角色授予执行权限,例如:

GRANT EXECUTE ON FUNCTION dblink_connect_u(text) TO caixa;
GRANT EXECUTE ON FUNCTION dblink_connect_u(text, text) TO caixa;
Run Code Online (Sandbox Code Playgroud)

工作实例(后GRANT):

meta=> SELECT dblink_connect_u('conn1', 'dbname=op');
meta=> SELECT * FROM dblink('conn1','SELECT op_col from op_table')
            AS t(op_col varchar);
 op_col 
--------
 aaa
 bbb
 ccc
(3 rows)
meta=> SELECT dblink_disconnect('conn1');
Run Code Online (Sandbox Code Playgroud)

编辑:

很抱歉有些误导性的回答.当然,你并不需要dblink_connect_u对MD5验证的连接.我看到有一种可能性.PostgreSQL有两种不同的连接类型:主机本地.

运行:

psql -h localhost ..

包含主机连接,但是

dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa');

使用本地类型,因此如果您有本地连接的非密码方法(例如ident方法或信任),则返回

ERROR:  password is required
DETAIL:  Non-superuser cannot connect if the server does not request a password.
HINT:  Target server's authentication method must be changed.
Run Code Online (Sandbox Code Playgroud)

校验

dblink_connect('mycon','hostaddr=127.0.0.1 dbname=vchitta_op user=caixa password=caixa')

用于主机连接.为清楚起见,请发布您的pg_hba.conf.

我还检查了DB的CONNECT权限vchitta_op,但错误信息不同:

REVOKE CONNECT ON DATABASE vchitta_op FROM PUBLIC;
REVOKE CONNECT ON DATABASE vchitta_op FROM caixa;

SELECT dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa');
ERROR:  could not establish connection
DETAIL:  FATAL:  permission denied for database "vchitta_op"
DETAIL:  User does not have CONNECT privilege.
Run Code Online (Sandbox Code Playgroud)


Ale*_*exM 5

有一种变通办法可以解决我的问题。如果设置了“ SECURITY DEFINER”选项,则非超级用户可以使用超级用户的特权执行功能。(http://www.postgresql.org/docs/9.1/static/sql-createfunction.html

这意味着您可以创建一个函数(具有超级用户所有者和SECURITY DEFINER选项)来执行跨数据库操作(使用不带密码的dblink())并在非超级用户下执行该函数