PostgreSQL以什么顺序检查对象权限?

PostgreSQL以什么顺序检查对象权限?,第1张

概述给定数据库角色user1,函数something()定义为存储过程,并创建如下视图: CREATE VIEW view1 AS select * from something() 并且,鉴于此权限: REVOKE ALL ON FUNCTION something FROM user1REVOKE SELECT ON view1 FROM user1 当我运行SELECT * FROM view 给定数据库角色user1,函数something()定义为存储过程,并创建如下视图:
CREATE VIEW vIEw1 AS select * from something()

并且,鉴于此权限:

REVOKE ALL ON FUNCTION something FROM user1REVOKE SELECT ON vIEw1 FROM user1

当我运行SELECT * FROM vIEw1时,我得到一个错误的权限拒绝函数something().

我的问题是,如果我撤销视图的选择权限,为什么要调用该函数?我期待得到类似的东西:

permission denIEd for relation vIEw1

谢谢!

在这种情况下的问题不完全是关于权限顺序,而是执行顺序.

在简历中,对于Postgresql:

1-正在访问表的视图将覆盖表权限

2-视图访问功能,需要在检查之前评估所有功能 – 因此必须在访问视图之前执行这些功能,即使视图没有选择权限……

我们怎么能证明这一点?

在postgresql中,即使用户没有此权限,视图也能为您提供在表中执行选择的权限.

例如:

create vIEw vIEw2 as select * from table1;revoke all on table1 from user1;grant select on vIEw2 to user1;

以用户1身份登录:

select * from table1 (permission denIEd) select * from vIEw2 (sucess - the query executes)

在这种情况下,即使没有选择表的权限,用户也可以选择vIEw2.

但是如果我们用函数做同样的事情呢?行为是不一样的.让我们创建一个在返回1之前等待5秒的函数(所以我们可以调试,如果postgresql每次调用视图时都运行该函数)

CREATE OR REPLACE FUNCTION something() RETURNS integerAS 'select 1 from pg_sleep(5);'LANGUAGE sqlIMMUtableRETURNS NulL ON NulL input; --this function will delay 5 secondscreate vIEw vIEw1 as select * from something();revoke all on function something() from user1;grant select on vIEw1 to user1;

以用户1身份登录:

select * from something(); (permission denIEd for something) select * from vIEw1 (permission denIEd for something )

在视图上执行选择的权限不会覆盖功能权限,如果我们从vIEw1撤消权限,则更糟糕的是,该消息仍然显示postgresql由于该功能而停止了我们的查询,无论视图的权限是什么. (这正是问题中发生的事情)

但是这个功能真的先被检查了吗?如果我们给该函数赋予’all’权限,但撤销视图权限…

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

正如你看到postgresql WAITED 5 SECONDS之前说我们没有输出视图的权限,表明执行了“something()”函数.因此在检查视图之前必须存在函数数据返回.

所以现在通过这些测试,我们现在知道Postgresql需要在继续我们的查询之前首先评估所有函数,就像查询在所有涉及的函数完全完成之前仍然不存在,所以视图不能解决为postgresql到知道我们是否有权选择它.

我认为这可以用“权限顺序”的方式回答你的问题,但是为什么postgresql需要在继续之前评估所有的功能,那就是另一个问题……

总结

以上是内存溢出为你收集整理的PostgreSQL以什么顺序检查对象权限?全部内容,希望文章能够帮你解决PostgreSQL以什么顺序检查对象权限?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1167883.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存