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 在多租户环境中尤其有用,可以确保数据隔离和安全。
相关推荐
大模型微调Online7 分钟前
深度复盘:Qwen3-4B-Instruct-2507微调实战——打造“快思考、强执行”的 ReAct IoT Agent
java·后端·struts
cyforkk11 分钟前
14、Java 基础硬核复习:数据结构与集合源码的核心逻辑与面试考点
java·数据结构·面试
江湖有缘13 分钟前
华为云之基于鲲鹏服务器部署打砖块小游戏全流程
服务器·华为云·github
Warren9822 分钟前
Pytest Fixture 到底该用 return 还是 yield?
数据库·oracle·面试·职场和发展·单元测试·pytest·pyqt
Big Cole32 分钟前
PHP 面试:MySQL 核心问题之索引与优化
mysql·面试·php
雁于飞1 小时前
【无标题】
笔记·面试·职场和发展·跳槽·产品经理·创业创新·学习方法
Z.风止1 小时前
Go-learning(1)
开发语言·笔记·后端·golang
光电大美美-见合八方中国芯1 小时前
【SOA仿真6】多层膜仿真计算
后端·restful
小马爱打代码1 小时前
Spring Boot:Sentinel 企业级熔断、降级与限流实战
spring boot·后端·sentinel
鱼跃鹰飞1 小时前
Leetcode279:完全平方数
数据结构·算法·leetcode·面试