* feat: add changelog feature and update site navigation - Introduced a new Changelog page with pagination and detailed entry views. - Added components for displaying changelog entries, pagination, and entry details. - Updated site navigation to include a link to the new Changelog page. - Enhanced localization for changelog-related texts in marketing.json. * refactor: enhance Changelog page layout and entry display - Increased the number of changelog entries displayed per page from 2 to 20 for better visibility. - Improved the layout of the Changelog page by adjusting the container styles and removing unnecessary divs. - Updated the ChangelogEntry component to enhance the visual presentation of entries, including a new date badge with an icon. - Refined the CSS styles for Markdoc headings to improve typography and spacing. * refactor: enhance Changelog page functionality and layout - Increased the number of changelog entries displayed per page from 20 to 50 for improved user experience. - Updated ChangelogEntry component to make the highlight prop optional and refined the layout for better visual clarity. - Adjusted styles in ChangelogHeader and ChangelogPagination components for a more cohesive design. - Removed unnecessary order fields from changelog markdown files to streamline content management. * feat: enhance Changelog entry navigation and data loading - Refactored ChangelogEntry page to load previous and next entries for improved navigation. - Introduced ChangelogNavigation component to facilitate navigation between changelog entries. - Updated ChangelogDetail component to display navigation links and entry details. - Enhanced data fetching logic to retrieve all changelog entries alongside the current entry. - Added localization keys for navigation text in marketing.json. * Update package dependencies and enhance documentation layout - Upgraded various packages including @turbo/gen and turbo to version 2.6.0, and react-hook-form to version 7.66.0. - Updated lucide-react to version 0.552.0 across multiple packages. - Refactored documentation layout components for improved styling and structure. - Removed deprecated loading components and adjusted navigation elements for better user experience. - Added placeholder notes in changelog entries for clarity.
89 lines
2.1 KiB
Plaintext
89 lines
2.1 KiB
Plaintext
---
|
|
title: "Row Level Security"
|
|
description: "Understanding and implementing Row Level Security (RLS) for data protection."
|
|
publishedAt: 2024-04-11
|
|
order: 2
|
|
status: "published"
|
|
---
|
|
|
|
> **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:
|
|
|
|
```sql
|
|
ALTER TABLE your_table ENABLE ROW LEVEL SECURITY;
|
|
```
|
|
|
|
## Common Policy Patterns
|
|
|
|
### Personal Account Access
|
|
|
|
```sql
|
|
CREATE POLICY "Users can access their personal account data"
|
|
ON your_table FOR ALL
|
|
USING (account_id = auth.uid());
|
|
```
|
|
|
|
### Team Account Access
|
|
|
|
```sql
|
|
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
|
|
|
|
```sql
|
|
-- 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:
|
|
|
|
```sql
|
|
-- 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.
|