- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在经历一种与 DEFAULT PRIVILEGES
相关的奇怪且(对我而言) 无法解释的行为。一旦在数据库范围内授予默认权限,似乎就不能仅针对特定模式撤销默认权限。我目前正在 CentOS 上使用 PostgreSQL 10.5 对此进行测试。
假设有 3 个用户:
admin Owner of the database. Used to manipulate the STRUCTURE of the database (CREATE, DROP, TRUNCATE...)
manager Used for DATA manipulation (INSERT, UPDATE, DELETE)
reader Used to read DATA (basically SELECT)
这个想法是:
admin
将是数据库和其中包含的所有对象的所有者manager
将用于跨所有 模式的数据操作,但 public
(只有用户 admin
可以修改数据在 public
架构中)reader
将能够阅读所有内容。为了使事情更简单,这将依赖于默认权限,以便新创建的对象(模式、表、 View 、函数等)都将具有正确的权限。
这是我第一次尝试类似的东西,而不是基于所有不同模式的多个用户的细粒度权限策略,显然这个设置应该非常简单。原来我错过了什么。
这是一个简单的测试脚本。用户 admin
是 db
数据库的所有者,所有这些命令都是作为 admin
连接到它发出的:
-- 1. User manager inherits from user "reader"
GRANT reader TO manager;
-- 2. Allow connections to the database to our users, but not PUBLIC
REVOKE ALL ON DATABASE db FROM PUBLIC;
GRANT CONNECT ON DATABASE db TO reader;
-- 3. Revoke default privileges from PUBLIC
ALTER DEFAULT PRIVILEGES REVOKE ALL ON SCHEMAS FROM PUBLIC;
ALTER DEFAULT PRIVILEGES REVOKE ALL ON TABLES FROM PUBLIC;
ALTER DEFAULT PRIVILEGES REVOKE ALL ON SEQUENCES FROM PUBLIC;
ALTER DEFAULT PRIVILEGES REVOKE ALL ON FUNCTIONS FROM PUBLIC;
-- 4. Grant default reading privileges to user "reader"
ALTER DEFAULT PRIVILEGES GRANT USAGE ON SCHEMAS TO reader;
ALTER DEFAULT PRIVILEGES GRANT SELECT ON TABLES TO reader;
ALTER DEFAULT PRIVILEGES GRANT SELECT ON SEQUENCES TO reader;
ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON FUNCTIONS TO reader;
-- 5. Grant Defauly writing privileges to user "manager"
ALTER DEFAULT PRIVILEGES GRANT INSERT, UPDATE, DELETE ON TABLES TO manager;
ALTER DEFAULT PRIVILEGES GRANT USAGE ON SEQUENCES TO manager;
-- 6. Reinit "public" schema
DROP SCHEMA public;
CREATE SCHEMA public;
-- 7. HERE COMES THE WEIRD STUFF, the two following statements don't have any effect at all
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE INSERT, UPDATE, DELETE ON TABLES FROM manager;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE USAGE ON SEQUENCES FROM manager;
这可以很容易地验证:
-- Execute as user "admin":
CREATE TABLE public.t (id serial PRIMARY KEY, dummy integer)
-- Execute as user "manager" (it should not be allowed, but it is!)
DELETE FROM public.t;
我知道我可以使用一些触发函数来规避这个问题,但问题的关键是这是否是正常的和预期的,某种错误还是我遗漏了什么?
最佳答案
我一直在考虑这个问题,我能想到的最优雅的解决方案依赖于 Event Trigger .
当然它并没有直接回答我的问题,意思是我还在想为什么不能那样使用默认权限,但这至少满足了set-and-forget的初始要求将提供默认权限。
创建一个函数来撤销不需要的权限并返回 event_trigger
:
CREATE FUNCTION reset_privileges() RETURNS event_trigger AS $$
BEGIN
IF EXISTS (SELECT true FROM pg_event_trigger_ddl_commands() WHERE schema_name = 'public') THEN
REVOKE INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public FROM manager;
REVOKE USAGE ON ALL SEQUENCES IN SCHEMA public FROM manager;
END IF;
END;
$$ LANGUAGE plpgsql;
创建一个实际的 EVENT TRIGGER (这需要 super 用户权限!):
CREATE EVENT TRIGGER reset_public_schema_privileges
ON ddl_command_end WHEN TAG IN (
'CREATE TABLE',
'CREATE TABLE AS',
'CREATE VIEW',
'CREATE MATERIALIZED VIEW',
'CREATE FUNCTION'
) EXECUTE PROCEDURE reset_privileges();
该函数检查新创建的对象是否在 public
中模式并最终撤销用户的所有不需要的权限 manager
.
它甚至懒得过滤那些对象,而是撤销了 ALL
的权限。 TABLE
小号,VIEW
s 和 FUNCTION
在 public
中模式。当然可以使用 object_identity
轻松定制它。 pg_event_trigger_ddl_commands 提供的字段以及函数内部更精细的逻辑。
关于PostgreSQL - 在数据库范围内授予 DEFAULT PRIVILEGES 并仅为特定模式撤销它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57242673/
在MySQL中,执行FLUSH TABLES, PRIVILEGES;和执行FLUSH TABLES;再执行FLUSH PRIVILEGES;效果一样吗?此外,这是否适用于任何刷新选项(FLUSH L
我和一名团队成员都被难住了,因为向远程用户授予权限的命令失败了,但没有错误。使用 CREATE USER 已成功将新用户添加到 mysql.user,但 GRANT PRIVILEGES 后跟 FLU
完全信任是否与以管理员身份运行相同?我读过一些说明“要使其正常工作,应用程序必须是完全信任的应用程序”的内容。这与您必须具有管理员权限才能运行应用程序相同吗?如果不是,有什么区别?如何判断应用程序是否
你能告诉我如何使用 psql 控制台检查函数的权限,但又不会被源代码和说明淹没吗(比如使用\df+ 时)。 最佳答案 对于更简单的查询,使用: SELECT proacl FROM pg_proc W
考虑以下代码: function Dog() { this.foo = function() {}; this.walk = function() { if(c
我使用的是 Windows 8.1 64 位计算机。我安装了 XAMPP 5.6.3。直到昨天一切都工作正常。我进入 phpMyAdmin 创建一个新数据库。当我进入数据库选项卡时;在“创建新数据库”
当我授予“ALL PRIVILEGES”时会授予哪些权限? -> ALL [PRIVILEGES] Grant all privileges at specified access level exc
大约在0.6版,privileged被引入docker。 使用该参数,container内的root拥有真正的root权限。 否则,container内的root只是外部的一个普通用户权限。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我对Docker技术有点陌生,但是,我想在整个基础架构中部署几个BGP BIRD容器。我想使用Dockerfile构建自动化容器创建,但是,如果不给容器“特权”模式,就无法在Docker中运行BIRD
我尝试使用此 SQL 代码来启用数据库创建 使用授予选项将 *.* 上的所有权限授予 'myuser'@'%'; 但它不起作用。 我已在Windows Azure 托管中创建了我的phpMyadmin
我发出以下命令以允许从任何主机进行 root 登录 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'xxxx' WITH GRANT
如何在不添加 XP 主题的情况下添加 UAC list ? 我尝试了这个 list :
有没有办法将docker环境分配给多个USB设备,比如/dev/video0, /dev/video4 and /dev/ttyUSB4? 如果是单个设备,则可能是 docker run -t -i
我正在经历一种与 DEFAULT PRIVILEGES 相关的奇怪且(对我而言) 无法解释的行为。一旦在数据库范围内授予默认权限,似乎就不能仅针对特定模式撤销默认权限。我目前正在 CentOS 上使用
我试图向远程 MySQL 用户授予 ALTER TABLE 权限,但是当我执行查询时,它会因错误而中断:“ALTER 命令被拒绝给用户 'remotetest'@'*****' 对于表'RemoteT
我希望使用 pymysql 模块根据用户输入自动创建数据库和用户。 我希望向一个数据库中新创建的用户授予所有权限: cur.execute("GRANT ALL PRIVILEGES ON %s.*
我试图理解并理解何时在 JavaScript 中使用私有(private)方法以及何时使用特权方法。根据这篇文章:Private Members in JavaScript ,对象的私有(privat
我的 Web 应用程序有问题:在我的管理 bean 中: private boolean isUserInDB() { List users = userFacade.findByLogin
在我的 Firefox OS 应用中,我想使用 XHR,因此我在 list 文件中将 type 设置为 privileged。 到目前为止我尝试过的轮播插件:Jssor和 Scooch ,当设置此类型
我是一名优秀的程序员,十分优秀!