在此示例中,第二列對于“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());
uj5u.com熱心網友回復:
RLS 只是隱式地WHERE向所有查詢添加了不可避免的子句,它不會干擾評估代碼的角色。從檔案:
"由于策略運算式直接添加到用戶的查詢中,它們將以運行整個查詢的用戶的權限運行。因此,使用給定策略的用戶必須能夠訪問運算式中參考的任何表或函式或當他們嘗試查詢啟用了行級安全性的表時,他們只會收到一個權限被拒絕的錯誤。 ”
此功能與授予的列權限正交。所以public角色必須能夠查看user_id列,否則評估user_id = session_user_id()會導致錯誤。真的沒有辦法讓列可見。
完全多余,我想盡可能地隱藏在內部
解決方案VIEW是不包含該列。它甚至可以更新!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/335123.html
標籤:PostgreSQL 删除行 特权 行级安全
