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

时间:2012-12-17 16:18:16

标签: postgresql grant

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

  

USAGE

     

...

     

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

     

...

但是,通过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 个答案:

答案 0 :(得分:1)

架构并不重要,您所看到的是函数的默认执行权限。 请考虑CREATE FUNCTION documentation

中的摘录
  

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