首页 > 解决方案 > 应用程序用户的列级安全“策略”

问题描述

有没有人处理过列级安全“策略”或如何最好地管理/实施它们,因为它们还不存在?

在我看来,我们为数据库管理员用户提供了很好的工具,可以通过授权获得列级安全性,但对于应用程序用户而言,其方式类似于 RLS。

我当前的解决方案是利用带有 whenClause 的触发器来检查权限。想象一下在同一个对象上创建一个作者和出版商的出版流程

CREATE TABLE posts (
    id serial primary key,
    title text,
    content text,
    published boolean DEFAULT FALSE,
    author_id uuid NOT NULL DEFAULT get_curent_user_id(),
    publisher_id uuid NOT NULL DEFAULT '85d770e6-7c18-4e98-bbd5-160b512e6c23'
);

CREATE TRIGGER ensure_only_publisher_can_publish
    AFTER UPDATE ON posts
    FOR EACH ROW
    WHEN (
        NEW.publisher_id <> get_curent_user_id ()
            AND
        OLD.published IS DISTINCT FROM NEW.published
    )
EXECUTE PROCEDURE throw_error ('OWNED_COLUMNS', 'published');

CREATE TRIGGER ensure_only_publisher_can_publish_insert
    AFTER INSERT ON posts
    FOR EACH ROW
    WHEN (
        NEW.publisher_id <> get_curent_user_id ()
            AND
        NEW.published IS TRUE
    )
EXECUTE PROCEDURE throw_error ('OWNED_COLUMNS', 'published');

如果您想运行该示例,我在此处包含了一个将所有 deps 包装在 tx 中的要点:https ://gist.github.com/pyramation/2a7b836ab47a2450b951a256dfe7cbde

有用!作者可以创建帖子,只有发布者可以“发布”它们。但是,它有一些缺点。

  1. 使用触发器,不能使用 BYPASSRLS 并且必须使用复制角色
  2. 据我所知,INSERT 的行为需要了解有效值或默认值

#1 我可以管理,如果在某些地方需要,我可以想象使用复制角色。然而,#2 感觉很笨重并且与数据模型紧密耦合,因为它需要默认值或列入白名单的值。

想法?我应该注意的任何其他解决方案?

标签: databasepostgresqlsecuritytriggers

解决方案


推荐阅读