尽管在列上缺少 select,但仍删除行
Delete row despite missing select right on a column
在此示例中,第二列对于组 'user_group' 的成员(角色)不应该可见,因为仅在内部需要此列来调节行级安全性。但是,只有在该列也可见时才能删除记录。你如何解决这个问题?
想到的选项是:
- 只需使第二列可见(即可选择),这将
实际上是完全多余的,我想隐藏在内部
尽可能
- 编写一个以提升的权限调用的函数
(安全定义者),我想要的更少。
还有其他选择吗?
(特别是对于删除,我想对其他表中的外键使用 'ON DELETE SET NULL' 这样的好东西,而不必为它们编写不必要的程序触发器)
create table test (
internal_id serial primary key,
user_id int not null default session_user_id(),
info text default null
);
grant
select(internal_id, info),
insert(info),
update(info),
delete
on test to user_group;
create policy test_policy on policy for all to public using (
user_id = session_user_id());
RLS 只是隐式地向所有查询添加不可避免的 WHERE
子句,它不会混淆评估代码的角色。来自 the docs:
"由于策略表达式直接添加到用户的查询中,因此它们将 运行 具有用户 运行 整个查询的权限。因此,用户使用给定策略的用户必须能够访问表达式中引用的任何 table 或函数,否则他们在尝试查询启用了行级安全性的 table 时只会收到权限被拒绝的错误。
此功能与授予的列权限正交。所以 public
角色必须能够查看 user_id
列,否则评估 user_id = session_user_id()
会导致错误。确实没有办法使该列可见。
completely superfluous and I want to hide internally as much as possible
解决方案是 VIEW
不包含该列。甚至会是 updatable!
在此示例中,第二列对于组 'user_group' 的成员(角色)不应该可见,因为仅在内部需要此列来调节行级安全性。但是,只有在该列也可见时才能删除记录。你如何解决这个问题?
想到的选项是:
- 只需使第二列可见(即可选择),这将 实际上是完全多余的,我想隐藏在内部 尽可能
- 编写一个以提升的权限调用的函数 (安全定义者),我想要的更少。
还有其他选择吗? (特别是对于删除,我想对其他表中的外键使用 'ON DELETE SET NULL' 这样的好东西,而不必为它们编写不必要的程序触发器)
create table test (
internal_id serial primary key,
user_id int not null default session_user_id(),
info text default null
);
grant
select(internal_id, info),
insert(info),
update(info),
delete
on test to user_group;
create policy test_policy on policy for all to public using (
user_id = session_user_id());
RLS 只是隐式地向所有查询添加不可避免的 WHERE
子句,它不会混淆评估代码的角色。来自 the docs:
"由于策略表达式直接添加到用户的查询中,因此它们将 运行 具有用户 运行 整个查询的权限。因此,用户使用给定策略的用户必须能够访问表达式中引用的任何 table 或函数,否则他们在尝试查询启用了行级安全性的 table 时只会收到权限被拒绝的错误。
此功能与授予的列权限正交。所以 public
角色必须能够查看 user_id
列,否则评估 user_id = session_user_id()
会导致错误。确实没有办法使该列可见。
completely superfluous and I want to hide internally as much as possible
解决方案是 VIEW
不包含该列。甚至会是 updatable!