EmirBase LogoEmirBase Logo
  • Home
  • Blog
  • Services
  • Pricing
  • FAQ
  • Contact
Sign InSign Up
EmirBase LogoEmirBase Logo

footerDescription

copyright

about
  • Blog
  • contact
product
  • Documentation
legal
  • Terms of Service
  • Privacy Policy
  • cookiePolicy
  • Introduction
    • Installing Dependencies
    • Quick Start
    • Project Structure
    • Configuration
  • Authentication Overview
    • Configuration
    • Email & Password
    • OAuth
    • Magic Links
  • Database
    • Database Overview
    • Migrations
    • Row Level Security
    • Querying Data
    • Functions & Triggers
  • Features
    • Features Overview
    • Team Collaboration
    • File Uploads
  • Billing & Payments
    • Billing Overview
    • Pricing Plans
    • Webhook Integration

Row Level Security

Understanding and implementing Row Level Security (RLS) for data protection.

Note: This is mock/placeholder content for demonstration purposes.

Row Level Security (RLS) is PostgreSQL's built-in authorization system that controls which rows users can access in database tables.

Why RLS?

RLS provides several advantages:

  • Database-level security - Protection even if application code has bugs
  • Automatic enforcement - No need for manual authorization checks
  • Multi-tenant isolation - Ensures users only see their own data
  • Performance - Optimized at the database level

Enabling RLS

All tables should have RLS enabled:

ALTER TABLE your_table ENABLE ROW LEVEL SECURITY;

Common Policy Patterns

Personal Account Access

CREATE POLICY "Users can access their personal account data"
  ON your_table FOR ALL
  USING (account_id = auth.uid());

Team Account Access

CREATE POLICY "Users can access their team account data"
  ON your_table FOR ALL
  USING (
    account_id IN (
      SELECT account_id FROM accounts_memberships
      WHERE user_id = auth.uid()
    )
  );

Read vs Write Permissions

-- All members can read
CREATE POLICY "Team members can view data"
  ON your_table FOR SELECT
  USING (account_id IN (SELECT get_user_accounts(auth.uid())));

-- Only owners can modify
CREATE POLICY "Only owners can modify data"
  ON your_table FOR UPDATE
  USING (
    account_id IN (
      SELECT account_id FROM accounts_memberships
      WHERE user_id = auth.uid() AND role = 'owner'
    )
  );

Testing RLS Policies

Always test your RLS policies to ensure they work correctly:

-- Test as specific user
SET request.jwt.claims.sub = 'user-uuid-here';

-- Try to select data
SELECT * FROM your_table;

-- Reset
RESET request.jwt.claims.sub;

Admin Bypass

Service role keys bypass RLS. Use with extreme caution and always implement manual authorization checks when using the admin client.