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 在多租户环境中尤其有用,可以确保数据隔离和安全。
相关推荐
欧阳有财18 分钟前
[java八股文][Mysql面试篇]日志
java·mysql·面试
到账一个亿2 小时前
后端树形结构
后端
武子康2 小时前
大数据-31 ZooKeeper 内部原理 Leader选举 ZAB协议
大数据·后端·zookeeper
我是哪吒2 小时前
分布式微服务系统架构第155集:JavaPlus技术文档平台日更-Java线程池实现原理
后端·面试·github
代码老y2 小时前
Spring Boot + 本地部署大模型实现:安全性与可靠性保障
spring boot·后端·bootstrap
LaoZhangAI2 小时前
OpenAI API 账号分层完全指南:2025年最新Tier系统、速率限制与升级攻略
前端·后端
红衣信2 小时前
前端与后端存储全解析:从 Cookie 到缓存策略
前端·后端·面试
Kyrie_Li2 小时前
(十五)Spring Test
java·后端·spring
WildBlue2 小时前
🎉 手写call的魔法冒险:前端开发者的“换身份”指南🚀
前端·后端
fortmin2 小时前
使用Apache Pdfbox生成pdf
后端