san*_*ios 16 postgresql permissions view
给定数据库角色,定义为存储过程user1
的函数something()
和创建的视图,如下所示:
CREATE VIEW view1 AS select * from something()
Run Code Online (Sandbox Code Playgroud)
并且,鉴于此权限:
REVOKE ALL ON FUNCTION something FROM user1
REVOKE SELECT ON view1 FROM user1
Run Code Online (Sandbox Code Playgroud)
当我运行时SELECT * FROM view1
,出现错误permission denied for function something()
。
我的问题是,如果我撤销对视图的选择权限,为什么会调用该函数?我期待收到类似的东西:
permission denied for relation view1
Run Code Online (Sandbox Code Playgroud)
谢谢!
这种情况下的问题不完全是关于权限顺序,而是关于执行顺序。
在简历中,对于 PostgreSQL :
1-访问表的视图将覆盖表权限
2-视图访问函数,在检查之前需要评估所有函数 - 因此即使视图没有选择权限,也必须在访问视图之前执行函数...
我们如何证明这一点?
在 postgresql 中,视图能够授予您在表中进行选择的权限,即使用户没有此权限。
例如:
create view view2 as select * from table1;
revoke all on table1 from user1;
grant select on view2 to user1;
Run Code Online (Sandbox Code Playgroud)
以用户 1 身份登录:
select * from table1 (permission denied)
select * from view2 (sucess - the query executes)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,即使用户没有选择表的权限,也可以选择 view2。
但是如果我们对函数做同样的事情呢?行为并不相同。让我们创建一个函数,在返回 1 之前等待 5 秒(这样我们就可以调试 postgresql 是否在每次调用视图时都运行该函数)
CREATE OR REPLACE FUNCTION something() RETURNS integer
AS 'select 1 from pg_sleep(5);'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT; --this function will delay 5 seconds
create view view1 as select * from something();
revoke all on function something() from user1;
grant select on view1 to user1;
Run Code Online (Sandbox Code Playgroud)
以用户 1 身份登录:
select * from something(); (permission denied for something)
select * from view1 (permission denied for something )
Run Code Online (Sandbox Code Playgroud)
在视图上执行 select 的权限不会覆盖函数权限,更糟糕的是,如果我们撤销 view1 的权限,该消息仍然显示 postgresql 由于该函数而停止了我们的查询,无论视图的权限是什么。 (这正是问题中发生的情况)
但功能真的是首先被检查的吗?如果我们向该函数授予“所有”权限,但撤销查看权限......
grant all on function something to user1;
revoke all on view1 from user1;
select * from view1;
Delayed 5 seconds... (the function executed!)
Permission denied for select on view1
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,postgresql等待了 5 秒 才说我们没有输出视图的权限,表明“something()”函数被执行了。所以函数数据返回必须在视图检查之前存在。
所以现在通过这个测试,我们现在知道PostgreSQL在继续我们的查询之前需要首先评估所有函数,就像查询在所有涉及的函数完全完成之前仍然不存在一样,所以视图无法被postgresql解决知道我们是否有权选择它。
我认为这从“权限顺序”的角度回答了你的问题,但是为什么 postgresql 需要在继续之前评估所有函数,这是另一个问题......
归档时间: |
|
查看次数: |
446 次 |
最近记录: |