Row-Level Security (RLS)

PostgreSQL 的“行级权限”总开关,开了以后每行都要通过策略检查才能被看见/改写

-- 启用
ALTER TABLE conversations ENABLE ROW LEVEL SECURITY;

-- 关闭
ALTER TABLE conversations DISABLE ROW LEVEL SECURITY;

Policies

为某张表、某种操作(SELECTINSERTUPDATEDELETE)定义布尔规则,决定哪些行可见或可修改。

-- 语法
CREATE POLICY policy_name
  ON table_name
  FOR { SELECT | INSERT | UPDATE | DELETE | ALL }
  [ TO role [, ...] ]
  [ USING ( boolean_expression ) ]
  [ WITH CHECK ( boolean_expression ) ];

-- 示例
CREATE POLICY "members-can-access"
  ON conversations
  FOR ALL
  USING (
    EXISTS (
      SELECT 1 FROM conversation_members
      WHERE conversation_id = conversations.id
        AND user_id = auth.uid()
    )
  );

基本结构

CREATE POLICY policy_name
  ON table_name
  FOR { ALL | SELECT | INSERT | UPDATE | DELETE }
  [ TO { role_name | PUBLIC | authenticated | anon | ... } [, ...] ]
  [ USING ( expression ) ]
  [ WITH CHECK ( expression ) ];

参数解释

注意

示例

CREATE POLICY policy_name
  ON projects
  FOR SELECT
USING (
  EXISTS (
    SELECT 1
    FROM project_members
    WHERE
      project_members.project_id = projects.id AND
      project_members.user_id = auth.uid()
  )
)