【问题标题】:How to revoke right to a usergroup on a certain date in postgresql?如何在postgresql中的某个日期撤销用户组的权限?
【发布时间】:2013-05-15 12:56:30
【问题描述】:

我目前正在使用 Postgresql 创建数据库。第一次,温柔点。 ;)

我有一个表project,其中存储了提交日期等内容。

我有 2 组用户。只能查询数据库,没有更新/插入/删除权限,很简单。

另一组有权对他们的项目做任何他们想做的事,但仅限于提交日期。

我正在寻找一个不错的方法。

我想到了一个触发函数,该函数检查current_date 和存储在数据库中的日期,如果通过则撤销权限,然后引发异常'您不再拥有修改该项目的权限。 我可以在所有桌子上使用相同的触发器。 我认为这可行,但我不知道这是否是正确/好方法。

PS:如果有人也有一些关于 1..* 到 0..* 关系的提示......

【问题讨论】:

  • 什么关系?你提到了一个表project ...

标签: postgresql date database-design role rights


【解决方案1】:

您可以考虑的一件事是,如果第二组在特定日期之后将无法访问数据库,您可以在那时撤销他们的登录权限。请注意如何取决于身份验证细节,但如果是密码登录,您只需:

ALTER USER foo VALID UNTIL '2013-07-01';

请注意,这只会使密码过期。然后,您可以有一个定期执行的 cron 作业并清理过期用户(信息在 pg_authid 系统表中)。

如果用户仍然可以访问 PostgreSQL 实例,您将需要接受 Erwin 的建议。

【讨论】:

    【解决方案2】:

    按对象授予权限。您不能使用GRANT / REVOKE 直接授予每行权限。

    解决此问题的一种方法是VIEW,它只显示尚未提交的项目。 SELECT 权限简单,UPDATE / DELETE 更复杂。您需要在视图上使用 INSTEAD rules,这很棘手,尤其是对于初学者而言。

    另一个明显的选择是您已经想到的,只是更简单。您不必实际撤销特权。只需为提交的项目抛出异常:

    CREATE OR REPLACE FUNCTION trg_p_updelno()
      RETURNS trigger AS
    $func$
    BEGIN
    IF pg_has_role('other_group', 'member')
       AND OLD.submission_date < now()::date THEN
       RAISE EXCEPTION 'Too late, Kate! Project already submitted.';
    END IF;
    
    RETURN NULL;
    
    END
    $func$
      LANGUAGE plpgsql;
    
    CREATE TRIGGER updelno
    BEFORE UPDATE OR DELETE ON project
    FOR EACH ROW
    EXECUTE PROCEDURE trg_p_updelno();
    

    pg_has_role()Access Privilege Inquiry Functions 之一,应该会派上用场。

    当然,您希望阻止这些用户编辑提交日期。您也可以在触发器中执行此操作。
    但是在可以触发ON DELETE 的触发函数中引用NEW 时要小心,其中NEW 不存在。看看examples in the manual using TG_OP here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2015-07-30
      • 2018-06-12
      • 2018-09-29
      • 1970-01-01
      相关资源
      最近更新 更多