我的目标是仅允许特定用户执行特定模式中的函数,按名称列出可用的函数,但看不到函数的源代码或列出其他模式。
通过执行以下操作,无需列出可用函数名称即可实现上述目的:
首先创建一个测试用户角色:
CREATE ROLE test_user WITH LOGIN PASSWORD 'secret';
现在撤销公众对所有模式的所有权限:
REVOKE ALL PRIVILEGES ON DATABASE test_db FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA function_schema FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA function_schema FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA function_schema FROM PUBLIC;
REVOKE ALL ON SCHEMA function_schema FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA table_schema FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA table_schema FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA table_schema FROM PUBLIC;
REVOKE ALL ON SCHEMA table_schema FROM PUBLIC;
为测试用户设置限制访问:
GRANT CONNECT ON DATABASE test_db TO test_user;
GRANT USAGE ON SCHEMA function_schema TO test_user;
REVOKE ALL ON SCHEMA public FROM test_user;
REVOKE ALL ON SCHEMA table_schema FROM test_user;
GRANT EXECUTE ON FUNCTION function_schema.function1() TO test_user;
GRANT EXECUTE ON FUNCTION function_schema.function2(integer) TO test_user;
如何向测试用户和公众隐藏模式结构和代码:
REVOKE SELECT ON TABLE pg_proc FROM public;
REVOKE SELECT ON TABLE pg_proc FROM test_user;
这一切都运行良好,测试用户可以执行函数,但他们看不到函数内部的代码,也看不到模式和表结构。
--
我想允许测试用户现在可以在 test_functions 模式中按名称查看函数。我已经根据以下内容尝试了以下操作授予 Postgresql 9.3 http://www.postgresql.org/docs/9.3/static/sql-grant.html(这是在 pg_proc 中的每一列上授予选择):
GRANT SELECT (proname,pronamespace,proowner,prolang,procost,prorows,
provariadic,protransform,proisagg,proiswindow,prosecdef,proleakproof,
proisstrict,proretset,provolatile,pronargs,pronargdefaults,prorettype,
proargtypes,proallargtypes,proargmodes,proargnames,proargdefaults,prosrc,
probin,proconfig,proacl) ON TABLE pg_proc TO test_user;
这里的结果是测试用户没有获得与有权访问整个表一样的所有相同的选择权限。他们仍然看不到函数名称。
另一个测试是执行相反的操作,向表授予选择权,然后根据以下条件撤销所有列上的选择撤销 postgresql 9.3 http://www.postgresql.org/docs/9.3/static/sql-revoke.html:
GRANT SELECT ON TABLE pg_proc TO test_user;
REVOKE SELECT (proname,pronamespace,proowner,prolang,procost,prorows,
provariadic,protransform,proisagg,proiswindow,prosecdef,proleakproof,
proisstrict,proretset,provolatile,pronargs,pronargdefaults,prorettype,
proargtypes,proallargtypes,proargmodes,proargnames,proargdefaults,prosrc,
probin,proconfig,proacl) ON TABLE pg_proc FROM test_user;
同样,这不起作用,他们现在可以看到所有模式、代码和表(在允许的模式上)。
似乎特定列上的授予/撤销并不按照文档建议的方式工作。
广泛搜索得出如何限制对函数中代码的访问 https://stackoverflow.com/questions/3651720/postgresql-how-can-i-restrict-access-to-code-in-a-function-for-a-userwich 建议仅撤销对 pg_proc.prosrc 列的访问,从上面的测试来看,该列显然不起作用。
我正在使用 postgresql 9.3
请随意提出您想到的任何其他解决方案。