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 在多租户环境中尤其有用,可以确保数据隔离和安全。
相关推荐
写写闲篇儿31 分钟前
微软面试之白板做题
面试·职场和发展
派大鑫wink33 分钟前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
程序员爱钓鱼1 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
xUxIAOrUIII1 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home1 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
zfj3211 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_462446231 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
JIngJaneIL2 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码2 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
小信啊啊2 小时前
Go语言切片slice
开发语言·后端·golang