如果在包含架构上授予 USAGE 权限,Postgresql 将忽略缺少 EXECUTE 权限

Posted

技术标签:

【中文标题】如果在包含架构上授予 USAGE 权限,Postgresql 将忽略缺少 EXECUTE 权限【英文标题】:Postgresql ignores lack of EXECUTE permission if USAGE permission is granted on containing schema 【发布时间】:2012-12-04 18:24:49 【问题描述】:

来自http://www.postgresql.org/docs/9.1/static/sql-grant.html

用法

...

对于模式,允许访问包含在指定模式中的对象(假设也满足对象自身的权限要求)。本质上,这允许被授权者在模式中“查找”对象。如果没有此权限,仍然可以查看对象名称,例如通过查询系统表。 ...

...

但是,通过psql 运行以下脚本似乎表明,虽然缺少 SELECT 权限会导致错误,但缺少 EXECUTE 权限不会,这与文档相矛盾,因为不满足“自己的权限要求” .

CREATE DATABASE testdb WITH OWNER postgres ENCODING 'UTF8';
\connect testdb
CREATE ROLE testrole;
CREATE SCHEMA testschema;
GRANT USAGE ON SCHEMA testschema TO testrole;
SET search_path TO testschema;

CREATE FUNCTION testfunc ()
RETURNS VOID
AS $$
BEGIN
  RAISE NOTICE 'IN TESTFUNC';
  RAISE NOTICE 'Current user: %', current_user;
END;
$$
LANGUAGE plpgsql;

CREATE TABLE testtable
(
  testrow INT
);

INSERT INTO testtable (testrow) VALUES (1), (2), (3);

SET ROLE testrole;

SELECT testfunc();
SELECT * FROM testtable;

RESET ROLE;

输出:

$ psql -f usage.sql
CREATE DATABASE
You are now connected to database "testdb" as user "postgres".
CREATE ROLE
CREATE SCHEMA
GRANT
SET
CREATE FUNCTION
CREATE TABLE
INSERT 0 3
SET
psql:usage.sql:27: NOTICE:  IN TESTFUNC
psql:usage.sql:27: NOTICE:  Current user: testrole
 testfunc 
----------

(1 row)

psql:usage.sql:28: ERROR:  permission denied for relation testtable
RESET

我是否遗漏了某些内容或未正确使用权限?

【问题讨论】:

【参考方案1】:

架构在这里并不重要,您看到的是函数的默认执行权限。 考虑一下CREATE FUNCTION documentation的这段摘录:

要记住的另一点是,默认情况下,执行权限是 授予 PUBLIC 以用于新创建的功能(有关更多信息,请参阅 GRANT 信息)。您经常希望限制证券的使用 定义器功能仅适用于某些用户。为此,您必须撤销 默认 PUBLIC 权限,然后授予执行权限 选择性地。

【讨论】:

确实,添加 REVOKE ALL ON FUNCTION testfunc () FROM PUBLIC;解决了我遇到的“问题”。非常感谢。

以上是关于如果在包含架构上授予 USAGE 权限,Postgresql 将忽略缺少 EXECUTE 权限的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 间接权限

为了在模式中创建表,角色需要的完整权限列表是啥?

postgresql - 查看架构权限

mysql的所有权限

ALTER SCHEMA NAME 是不是会影响对 Redshift 中架构的权限授予

MySQL的权限都有哪些