Skip to content

Row-Level Security (RLS)

Implement fine-grained access control at the row level for multi-tenant applications.

Enabling RLS

ALTER TABLE orders ENABLE ROW LEVEL SECURITY;

Creating Policies

Basic Tenant Isolation

CREATE POLICY tenant_isolation ON orders
FOR ALL
USING (tenant_id = current_tenant_id());

Read-Only Public Access

CREATE POLICY public_read ON products
FOR SELECT
TO PUBLIC
USING (published = true);

Insert Validation

CREATE POLICY insert_own_data ON documents
FOR INSERT
WITH CHECK (owner_id = current_user_id());

Policy Types

Type Description
PERMISSIVE Multiple policies are OR'd together
RESTRICTIVE Multiple policies are AND'd together

For All Operations

CREATE POLICY full_access ON accounts
FOR ALL
USING (owner_id = current_user_id())
WITH CHECK (owner_id = current_user_id());

System Functions

Function Description
current_tenant_id() Current tenant ID
current_tenant_name() Current tenant name
current_user_id() Current user ID

View Policies

SELECT * FROM pg_rls_policies();

REPL Commands

\tenant rls create orders policy_name "tenant_id = current_tenant_id()"
\tenant rls list orders
\tenant rls delete orders policy_name

Disabling RLS

ALTER TABLE orders DISABLE ROW LEVEL SECURITY;
DROP POLICY policy_name ON orders;