当调用PostgreSQL中的函数或过程时,其中执行上下文是SECURITY DEFINER,对current_user和current_role的调用返回定义者的值,而不是当前登录用户(或设置角色)的值。
例如,下面的场景...
postgres=# select current_role, current_user;
current_role | current_user
--------------+--------------
postgres | postgres
(1 row)
postgres=# create schema test;
CREATE SCHEMA
postgres=# grant usage on schema test to public;
GRANT
postgres=# create user testproxy login password 'Password00';
CREATE ROLE
postgres=# create user testuser login password 'Password00';
CREATE ROLE
postgres=# grant testuser to testproxy;
GRANT ROLE
postgres=# create or replace function test.the_role() returns varchar as $$
postgres$# begin
postgres$# return current_role::text;
postgres$# end; $$ language plpgsql security definer set search_path = test, pg_temp, pg_catalog;
CREATE FUNCTION
postgres=# create or replace function test.the_user() returns varchar as $$
postgres$# begin
postgres$# return current_user::text;
postgres$# end; $$ language plpgsql security definer set search_path = test, pg_temp, pg_catalog;
CREATE FUNCTION
postgres=# grant execute on function test.the_role() to public;
GRANT
postgres=# grant execute on function test.the_user() to public;
GRANT
字符串
现在我们使用testproxy
帐户登录到数据库,运行测试.
postgres=> select current_role::text, current_user::text;
current_role | current_user
--------------+--------------
testproxy | testproxy
postgres=> set role testuser;
SET
postgres=> select current_role::text, current_user::text;
current_role | current_user
--------------+--------------
testuser | testuser
(1 row)
postgres=> select test.the_role(), test.the_user();
the_role | the_user
----------+----------
postgres | postgres
(1 row)
型
正如你所看到的,直接调用current_role和current_user工作正常,但是当在另一个函数中调用时,它们返回函数所有者,而不是登录用户。如果我改为使用SECURITY INVOKER,我的理解是它将返回登录用户。
但这里的问题,我需要它是安全定义,因为用户可能没有访问底层调用或对象,但我仍然需要它返回登录的用户!
有人对此有解决方案吗?
1条答案
按热度按时间mkshixfv1#
在你的问题中没有明确的问题陈述,但是如果我从字里行间读出来,我猜你希望有一个返回经过身份验证的用户的函数,不管你当前在什么安全上下文下运行。
您可以使用以下命令获取经过身份验证的用户:
字符串