database - 应用程序用户的列级安全“策略”
问题描述
有没有人处理过列级安全“策略”或如何最好地管理/实施它们,因为它们还不存在?
在我看来,我们为数据库管理员用户提供了很好的工具,可以通过授权获得列级安全性,但对于应用程序用户而言,其方式类似于 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
有用!作者可以创建帖子,只有发布者可以“发布”它们。但是,它有一些缺点。
- 使用触发器,不能使用 BYPASSRLS 并且必须使用复制角色
- 据我所知,INSERT 的行为需要了解有效值或默认值
#1 我可以管理,如果在某些地方需要,我可以想象使用复制角色。然而,#2 感觉很笨重并且与数据模型紧密耦合,因为它需要默认值或列入白名单的值。
想法?我应该注意的任何其他解决方案?
解决方案
推荐阅读
- python - 为什么我在 python 列表中出现演示错误?
- python-3.x - 在 Python 中为某个日期生成 UNIX 时间
- java - 使用opencsv读取包含'\'字符串和'\0'附件的CSV文件?
- javascript - 为什么有些事件处理程序是由 dispatchEvent 触发的,而有些不是?
- node.js - 在 heroCard botframework (nodejs) 中提及用户
- python - luigi 如何处理任务失败?
- css - CSS - 第一类的伪类
在另一个标签之后
- rust - 从另一个结构继承值
- python - VSCode 无法从虚拟环境中正确运行 pytest
- mongodb - 是否可以在 cosmos mongo db 上的多嵌套字段上创建索引?