PostgreSQL 行级安全性(RLS)简介

PostgreSQL 的行级安全性(RLS)是从 9.5 版本开始引入的功能,允许管理员根据用户身份或其他条件控制对表中特定行的访问。这种机制在多租户环境中尤其有用,可以确保不同用户只能看到授权的数据。

什么是行级安全性(RLS)?

RLS 是一种基于行的安全策略,通过定义策略来限制数据库用户对表数据的访问权限。在启用 RLS 之前,数据库的权限控制主要在表级别,即限制用户是否可以访问某个表。通过 RLS,不同的用户可以访问同一表中的不同数据。

如何启用行级安全性

要使用 RLS,需要在表上启用行级安全性,并创建相应的策略。

  1. 启用行级安全性

    sql 复制代码
    ALTER TABLE table_name ENABLE ROW LEVEL SECURITY;
  2. 创建策略

    sql 复制代码
    CREATE POLICY policy_name ON table_name
    FOR {SELECT | INSERT | UPDATE | DELETE}
    TO {role_name}
    USING (condition);
    • FOR 指定操作类型,可以是 SELECTINSERTUPDATEDELETE
    • TO 指定该策略适用的角色。
    • USING 指定条件,决定哪些行是可见或可操作的。

示例

创建表并启用 RLS

假设我们有一个 departments 表,想要限制用户只能看到自己管理的部门。

  1. 创建表

    sql 复制代码
    CREATE TABLE departments (
        id SERIAL PRIMARY KEY,
        name VARCHAR(255) NOT NULL UNIQUE,
        manager VARCHAR(255) NOT NULL
    );
  2. 插入数据

    sql 复制代码
    INSERT INTO departments(name, manager)
    VALUES('Sales', 'alice'),
          ('Marketing', 'bob'),
          ('IT', 'jack');
  3. 启用 RLS

    sql 复制代码
    ALTER TABLE departments ENABLE ROW LEVEL SECURITY;
  4. 创建策略

    sql 复制代码
    CREATE POLICY department_managers ON departments
    FOR SELECT
    TO managers
    USING (manager = current_user);

    这样,角色 alice 只能看到 manageralice 的行。

使用 Supabase Auth 的示例

在 Supabase 中,可以结合 Auth 进行更复杂的权限控制。

  1. 创建表

    sql 复制代码
    CREATE TABLE profiles (
        id UUID PRIMARY KEY,
        user_id UUID REFERENCES auth.users,
        avatar_url TEXT
    );
  2. 启用 RLS

    sql 复制代码
    ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
  3. 创建策略

    sql 复制代码
    CREATE POLICY user_profiles ON profiles
    FOR SELECT
    TO authenticated
    USING ((SELECT auth.uid()) = user_id);

    这样,用户只能看到自己的个人资料。

总结

  • 行级安全性(RLS) 是 PostgreSQL 中用于控制用户对表中行访问的强大工具。
  • 策略 可以定义为 SELECTINSERTUPDATEDELETE,并指定适用的角色和条件。
  • RLS 在多租户环境中尤其有用,可以确保数据隔离和安全。
相关推荐
PAK向日葵12 分钟前
【算法导论】PDD 0817笔试题题解
算法·面试
uzong2 小时前
技术故障复盘模版
后端
GetcharZp2 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程2 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi3 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国4 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy4 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
草梅友仁4 小时前
草梅 Auth 1.4.0 发布与 ESLint v9 更新 | 2025 年第 33 周草梅周报
vue.js·github·nuxt.js
AntBlack5 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt