PostgreSQL current_role,current_user执行上下文

ipakzgxi  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(157)

当调用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,我的理解是它将返回登录用户。
但这里的问题,我需要它是安全定义,因为用户可能没有访问底层调用或对象,但我仍然需要它返回登录的用户!
有人对此有解决方案吗?

mkshixfv

mkshixfv1#

在你的问题中没有明确的问题陈述,但是如果我从字里行间读出来,我猜你希望有一个返回经过身份验证的用户的函数,不管你当前在什么安全上下文下运行。
您可以使用以下命令获取经过身份验证的用户:

SELECT session_user;

字符串

相关问题