【问题标题】:Revoking right for user to DROP table撤销用户对 DROP 表的权限
【发布时间】:2019-09-11 15:24:12
【问题描述】:

我是 PostgreSQL 的忠实粉丝,但不知道它的某个方面是内置在用户管理中的。

我的问题是我已经设置了 pgAdmin 并且将有一些非开发人员手动更新某些特定表中的数据。为此,我创建了一个名为“admin”的新用户,并希望限制此用户的权限。

我已尝试使用以下查询(来自另一个用户)删除用户的所有权限:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM admin;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM admin;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM admin;

当我在名为“crap”的表上从用户 admin 编写一个简单的 SELECT 语句时,上面确实导致了以下错误:ERROR: permission denied for relation crap

但是我现在能够对用户 admin 执行以下操作:DROP TABLE crap; 有效!?

我对此感到非常惊讶。此用户不是 Postgres 超级用户。如何删除此权限以删除特定用户的表?

【问题讨论】:

  • 来自DocsOnly the table owner, the schema owner, and superuser can drop a table. 那么是谁的表呢?
  • 感谢您的评论。 SELECT * FROM pg_tables WHERE tablename = 'crap'; 表明此示例中的用户“admin”不是所有者。

标签: sql postgresql privileges


【解决方案1】:

您在权限层次结构中处于低一级。

REVOKE ALL PRIVILEGES FROM SCHEMA public FROM <role_name>;

您正在影响表中的权限。您还必须上一级架构以保护创建/删除访问。您可能还想撤销数据库级别的访问权限以保护架构。

REVOKE ALL PRIVILEGES FROM DATABASE <database_name> FROM <role_name>;

您也可以简单地删除用户。或者,您可以简单地禁用该用户的登录能力。

ALTER ROLE <role_name> SET NOLOGIN;

如果这些对您不起作用,您可以采用更复杂的方法并创建一个 event trigger 来监视 DROP TABLE 事件,与角色进行比较,并允许它继续或中止事务。

CREATE OR REPLACE FUNCTION no_admin_drop()
  RETURNS event_trigger LANGUAGE plpgsql AS $$
BEGIN
  IF CURRENT_USER = 'admin'::regrole THEN
    RAISE EXCEPTION 'command is disabled';
  END IF;
END;
$$;

CREATE EVENT TRIGGER no_admin_drop ON sql_drop
   EXECUTE FUNCTION no_admin_drop();

【讨论】:

  • 谢谢!我需要用户能够选择但不能删除。因此,删除用户不是一种选择。我试过撤销你提到的特权(应该是 ON 而不是 FROM 虽然我猜):``` REVOKE ALL PRIVILEGES ON DATABASE prices_prod FROM admin;从管理员撤消 SCHEMA public 上的所有权限; ``` 但是这个用户“admin”仍然能够删除表。有什么想法吗?
  • 我添加了另一个选项:事件触发器
  • 非常感谢!事件触发确实可以实现我想做的。我在另一个 Stackoverflow 线程中看到了一些东西,并试图沿着这条路走下去。不幸的是,我在 Google Cloud SQL 上运行我的 PSQL 实例,他们不允许用户拥有此类系统触发器所需的超级用户角色。
猜你喜欢
  • 1970-01-01
  • 2018-06-12
  • 2013-02-13
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
相关资源
最近更新 更多