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 在多租户环境中尤其有用,可以确保数据隔离和安全。
相关推荐
JavaGuide14 分钟前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
桦说编程26 分钟前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
格砸1 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
sunny8652 小时前
Claude Code 跨会话上下文恢复:从 8 次纠正到 0 次的工程实践
人工智能·开源·github
蝎子莱莱爱打怪2 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
哈密瓜的眉毛美2 小时前
零基础学Java|第三篇:DOS 命令、转义字符、注释与代码规范
后端
用户60572374873083 小时前
AI 编码助手的规范驱动开发 - OpenSpec 初探
前端·后端·程序员
哈密瓜的眉毛美3 小时前
零基础学Java|第二篇:Java 核心机制与第一个程序:从 JVM 到 Hello World
后端
用户8307196840823 小时前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq