跳转到主要内容

热门内容

今日:


总体:


最近浏览:


Chinese, Simplified

需要行级安全性(RLS)来维护PostgreSQL池模型中的租户数据隔离。RLS将隔离策略的实施集中在数据库级别,并消除了软件开发人员维护隔离的负担。实现RLS的最常见方法是在PostgreSQL DBMS中启用此功能。RLS涉及根据指定列中的值过滤对数据行的访问。您可以使用两种方法来过滤对数据的访问:

将表中指定的数据列与当前PostgreSQL用户的值进行比较。该用户可以访问列中与登录的PostgreSQL用户等效的值。

将表中指定的数据列与应用程序设置的运行时变量的值进行比较。在该会话期间,可以访问列中与运行时变量等效的值。

第二个选项是首选的,因为第一个选项需要为每个租户创建一个新的PostgreSQL用户。相反,使用PostgreSQL的SaaS应用程序应该负责在运行时查询PostgreSQL时设置租户特定的上下文。这将产生强制执行RLS的效果。您还可以逐个表启用RLS。作为最佳实践,您应该在包含租户数据的所有表上启用RLS。

以下示例创建两个表并启用RLS。此示例将一列数据与运行时变量app.current_tempant的值进行比较。

-- Create a table for our tenants with indexes on the primary key and the tenant’s name

CREATE TABLE tenant (

    tenant_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,

    name VARCHAR(255) UNIQUE,

    status VARCHAR(64) CHECK (status IN ('active', 'suspended', 'disabled')),

    tier VARCHAR(64) CHECK (tier IN ('gold', 'silver', 'bronze'))

);

 

-- Create a table for users of a tenant

CREATE TABLE tenant_user (

    user_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,

    tenant_id UUID NOT NULL REFERENCES tenant (tenant_id) ON DELETE RESTRICT,

    email VARCHAR(255) NOT NULL UNIQUE,

    given_name VARCHAR(255) NOT NULL CHECK (given_name <> ''),

    family_name VARCHAR(255) NOT NULL CHECK (family_name <> '')

);

 

-- Turn on RLS

ALTER TABLE tenant ENABLE ROW LEVEL SECURITY;

 

-- Restrict read and write actions so tenants can only see their rows

-- Cast the UUID value in tenant_id to match the type current_setting

-- This policy implies a WITH CHECK that matches the USING clause

CREATE POLICY tenant_isolation_policy ON tenant

USING (tenant_id = current_setting('app.current_tenant')::UUID);

 

-- And do the same for the tenant users

ALTER TABLE tenant_user ENABLE ROW LEVEL SECURITY;

 

CREATE POLICY tenant_user_isolation_policy ON tenant_user

USING (tenant_id = current_setting('app.current_tenant')::UUID);

 

有关更多信息,请参阅PostgreSQL行级安全的多租户数据隔离博客。AWS SaaS工厂团队也在GitHub中提供了一些示例来帮助实现RLS。

 

本文地址
最后修改
星期四, 一月 19, 2023 - 13:06
Article