superkit-mcp-server 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +102 -102
- package/README.md +71 -71
- package/SUPERKIT.md +168 -168
- package/agents/code-archaeologist.md +106 -106
- package/agents/coder.md +90 -90
- package/agents/data-engineer.md +28 -28
- package/agents/devops-engineer.md +242 -242
- package/agents/git-manager.md +203 -203
- package/agents/orchestrator.md +420 -420
- package/agents/penetration-tester.md +188 -188
- package/agents/performance-optimizer.md +187 -187
- package/agents/planner.md +270 -270
- package/agents/qa-automation-engineer.md +103 -103
- package/agents/quant-developer.md +32 -32
- package/agents/reviewer.md +100 -100
- package/agents/scout.md +222 -222
- package/agents/security-auditor.md +3 -2
- package/agents/tester.md +274 -274
- package/agents/ui-designer.md +208 -208
- package/build/index.js +18 -9
- package/build/tools/__tests__/loggerTools.test.js +5 -5
- package/build/tools/archTools.js +2 -19
- package/build/tools/autoPreview.js +2 -2
- package/build/tools/compoundTools.js +4 -4
- package/build/tools/docsTools.js +5 -10
- package/build/tools/loggerTools.js +1 -1
- package/build/tools/todoTools.js +39 -39
- package/build/tools/validators/__tests__/apiSchema.test.js +23 -23
- package/build/tools/validators/__tests__/convertRules.test.js +5 -5
- package/build/tools/validators/__tests__/frontendDesign.test.js +12 -12
- package/build/tools/validators/__tests__/geoChecker.test.js +19 -19
- package/build/tools/validators/__tests__/mobileAudit.test.js +12 -12
- package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +17 -17
- package/build/tools/validators/__tests__/securityScan.test.js +6 -6
- package/build/tools/validators/__tests__/seoChecker.test.js +16 -16
- package/build/tools/validators/__tests__/typeCoverage.test.js +14 -14
- package/build/tools/validators/convertRules.js +2 -2
- package/commands/README.md +122 -122
- package/commands/ask.toml +72 -72
- package/commands/brainstorm.toml +119 -119
- package/commands/chat.toml +77 -77
- package/commands/code-preview.toml +37 -37
- package/commands/code.toml +28 -28
- package/commands/content.toml +200 -200
- package/commands/cook.toml +77 -77
- package/commands/copywrite.toml +131 -131
- package/commands/db.toml +192 -192
- package/commands/debug.toml +166 -166
- package/commands/design.toml +158 -158
- package/commands/dev-rules.toml +14 -14
- package/commands/do.toml +117 -117
- package/commands/doc-rules.toml +14 -14
- package/commands/docs.toml +148 -148
- package/commands/fix.toml +440 -440
- package/commands/fullstack.toml +175 -175
- package/commands/git.toml +235 -235
- package/commands/help.toml +84 -84
- package/commands/integrate.toml +127 -127
- package/commands/journal.toml +136 -136
- package/commands/kit-setup.toml +40 -40
- package/commands/mcp.toml +183 -183
- package/commands/orchestration.toml +15 -15
- package/commands/plan.toml +171 -171
- package/commands/pm.toml +148 -148
- package/commands/pr.toml +50 -50
- package/commands/project.toml +32 -32
- package/commands/research.toml +117 -117
- package/commands/review-pr.toml +63 -63
- package/commands/review.toml +190 -190
- package/commands/scout-ext.toml +97 -97
- package/commands/scout.toml +79 -79
- package/commands/screenshot.toml +65 -65
- package/commands/session.toml +102 -102
- package/commands/skill.toml +384 -384
- package/commands/status.toml +22 -22
- package/commands/team.toml +56 -56
- package/commands/test.toml +164 -164
- package/commands/ticket.toml +70 -70
- package/commands/use.toml +106 -106
- package/commands/video.toml +83 -83
- package/commands/watzup.toml +71 -71
- package/commands/workflow.toml +14 -14
- package/package.json +35 -35
- package/skills/meta/README.md +30 -30
- package/skills/meta/api-design/SKILL.md +134 -134
- package/skills/meta/code-review/SKILL.md +44 -44
- package/skills/meta/code-review/checklists/pre-merge.md +25 -25
- package/skills/meta/code-review/workflows/architecture-pass.md +26 -26
- package/skills/meta/code-review/workflows/performance-pass.md +27 -27
- package/skills/meta/code-review/workflows/security-pass.md +29 -29
- package/skills/meta/compound-docs/SKILL.md +133 -133
- package/skills/meta/debug/SKILL.md +40 -40
- package/skills/meta/debug/templates/bug-report.template.md +31 -31
- package/skills/meta/debug/workflows/reproduce-issue.md +20 -20
- package/skills/meta/docker/SKILL.md +126 -126
- package/skills/meta/examples/supabase/SKILL.md +46 -46
- package/skills/meta/examples/supabase/references/best-practices.md +319 -319
- package/skills/meta/examples/supabase/references/common-patterns.md +373 -373
- package/skills/meta/examples/supabase/templates/migration-template.sql +49 -49
- package/skills/meta/examples/supabase/templates/rls-policy-template.sql +77 -77
- package/skills/meta/examples/supabase/workflows/debugging.md +260 -260
- package/skills/meta/examples/supabase/workflows/migration-workflow.md +211 -211
- package/skills/meta/examples/supabase/workflows/rls-policies.md +244 -244
- package/skills/meta/examples/supabase/workflows/schema-design.md +321 -321
- package/skills/meta/file-todos/SKILL.md +88 -88
- package/skills/meta/mobile/SKILL.md +140 -140
- package/skills/meta/nextjs/SKILL.md +101 -101
- package/skills/meta/performance/SKILL.md +130 -130
- package/skills/meta/react-patterns/SKILL.md +83 -83
- package/skills/meta/security/SKILL.md +114 -114
- package/skills/meta/session-resume/SKILL.md +96 -96
- package/skills/meta/tailwind/SKILL.md +139 -139
- package/skills/meta/testing/SKILL.md +43 -43
- package/skills/meta/testing/references/vitest-patterns.md +45 -45
- package/skills/meta/testing/templates/component-test.template.tsx +37 -37
- package/skills/tech/alpha-vantage/SKILL.md +142 -142
- package/skills/tech/alpha-vantage/references/commodities.md +153 -153
- package/skills/tech/alpha-vantage/references/economic-indicators.md +158 -158
- package/skills/tech/alpha-vantage/references/forex-crypto.md +154 -154
- package/skills/tech/alpha-vantage/references/fundamentals.md +223 -223
- package/skills/tech/alpha-vantage/references/intelligence.md +138 -138
- package/skills/tech/alpha-vantage/references/options.md +93 -93
- package/skills/tech/alpha-vantage/references/technical-indicators.md +374 -374
- package/skills/tech/alpha-vantage/references/time-series.md +157 -157
- package/skills/tech/doc.md +6 -6
- package/skills/tech/financial-modeling/SKILL.md +18 -18
- package/skills/tech/financial-modeling/skills/3-statements/SKILL.md +368 -368
- package/skills/tech/financial-modeling/skills/3-statements/references/formatting.md +118 -118
- package/skills/tech/financial-modeling/skills/3-statements/references/formulas.md +292 -292
- package/skills/tech/financial-modeling/skills/3-statements/references/sec-filings.md +125 -125
- package/skills/tech/financial-modeling/skills/dcf-model/SKILL.md +1210 -1210
- package/skills/tech/financial-modeling/skills/dcf-model/TROUBLESHOOTING.md +40 -40
- package/skills/tech/financial-modeling/skills/dcf-model/requirements.txt +8 -8
- package/skills/tech/financial-modeling/skills/dcf-model/scripts/validate_dcf.py +292 -292
- package/skills/tech/financial-modeling/skills/lbo-model/SKILL.md +236 -236
- package/skills/tech/financial-modeling/skills/merger-model/SKILL.md +108 -108
- package/skills/workflows/README.md +203 -203
- package/skills/workflows/adr.md +174 -174
- package/skills/workflows/changelog.md +74 -74
- package/skills/workflows/compound.md +323 -323
- package/skills/workflows/compound_health.md +74 -74
- package/skills/workflows/create-agent-skill.md +138 -139
- package/skills/workflows/cycle.md +144 -144
- package/skills/workflows/deploy-docs.md +84 -84
- package/skills/workflows/development-rules.md +42 -42
- package/skills/workflows/doc.md +95 -95
- package/skills/workflows/documentation-management.md +34 -34
- package/skills/workflows/explore.md +146 -146
- package/skills/workflows/generate_command.md +106 -106
- package/skills/workflows/heal-skill.md +97 -97
- package/skills/workflows/housekeeping.md +229 -229
- package/skills/workflows/kit-setup.md +102 -102
- package/skills/workflows/map-codebase.md +78 -78
- package/skills/workflows/orchestration-protocol.md +43 -43
- package/skills/workflows/plan-compound.md +439 -439
- package/skills/workflows/plan_review.md +269 -269
- package/skills/workflows/primary-workflow.md +37 -37
- package/skills/workflows/promote_pattern.md +86 -86
- package/skills/workflows/release-docs.md +82 -82
- package/skills/workflows/report-bug.md +135 -135
- package/skills/workflows/reproduce-bug.md +118 -118
- package/skills/workflows/resolve_pr.md +133 -133
- package/skills/workflows/resolve_todo.md +128 -128
- package/skills/workflows/review-compound.md +376 -376
- package/skills/workflows/skill-review.md +127 -127
- package/skills/workflows/specs.md +257 -257
- package/skills/workflows/triage-sprint.md +102 -102
- package/skills/workflows/triage.md +152 -152
- package/skills/workflows/work.md +399 -399
- package/skills/workflows/xcode-test.md +93 -93
|
@@ -1,244 +1,244 @@
|
|
|
1
|
-
# Row Level Security (RLS) Policy Design
|
|
2
|
-
|
|
3
|
-
Systematic approach to designing and implementing secure RLS policies in Supabase.
|
|
4
|
-
|
|
5
|
-
## When To Use
|
|
6
|
-
|
|
7
|
-
- Creating new tables with sensitive data
|
|
8
|
-
- Implementing multi-tenancy
|
|
9
|
-
- Setting up role-based access control
|
|
10
|
-
- Reviewing security requirements
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Prerequisites
|
|
15
|
-
|
|
16
|
-
- [ ] Understand data access requirements
|
|
17
|
-
- [ ] Know user roles and permissions
|
|
18
|
-
- [ ] Have auth.uid() available (Supabase auth enabled)
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Workflow
|
|
23
|
-
|
|
24
|
-
### Step 1: Define Access Requirements
|
|
25
|
-
|
|
26
|
-
**Questions to answer:**
|
|
27
|
-
|
|
28
|
-
1. **Who can READ this data?**
|
|
29
|
-
- Own data only?
|
|
30
|
-
- All users in same fund?
|
|
31
|
-
- Fund managers only?
|
|
32
|
-
- Public data?
|
|
33
|
-
|
|
34
|
-
2. **Who can WRITE (INSERT/UPDATE/DELETE)?**
|
|
35
|
-
- Owner only?
|
|
36
|
-
- Fund managers?
|
|
37
|
-
- System/service role only?
|
|
38
|
-
|
|
39
|
-
3. **What's the ownership model?**
|
|
40
|
-
- User-owned (profiles, preferences)
|
|
41
|
-
- Fund-owned (investments, transactions)
|
|
42
|
-
- Shared (multi-tenancy)
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
### Step 2: Enable RLS on Table
|
|
47
|
-
|
|
48
|
-
```sql
|
|
49
|
-
-- Always enable RLS first
|
|
50
|
-
ALTER TABLE schema.table ENABLE ROW LEVEL SECURITY;
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
> **Critical:** Without RLS enabled, data is publicly accessible!
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
### Step 3: Implement Policies
|
|
58
|
-
|
|
59
|
-
**Choose the appropriate pattern:**
|
|
60
|
-
|
|
61
|
-
#### Pattern A: User Owns Data
|
|
62
|
-
|
|
63
|
-
```sql
|
|
64
|
-
-- Policy: Users can view own data
|
|
65
|
-
CREATE POLICY "Users can view own data"
|
|
66
|
-
ON schema.table
|
|
67
|
-
FOR SELECT
|
|
68
|
-
TO authenticated
|
|
69
|
-
USING (user_id = auth.uid());
|
|
70
|
-
|
|
71
|
-
-- Policy: Users can update own data
|
|
72
|
-
CREATE POLICY "Users can update own data"
|
|
73
|
-
ON schema.table
|
|
74
|
-
FOR UPDATE
|
|
75
|
-
TO authenticated
|
|
76
|
-
USING (user_id = auth.uid())
|
|
77
|
-
WITH CHECK (user_id = auth.uid());
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
#### Pattern B: Role-Based Access
|
|
81
|
-
|
|
82
|
-
```sql
|
|
83
|
-
-- Policy: Fund Managers can view all
|
|
84
|
-
CREATE POLICY "Fund Managers can view all"
|
|
85
|
-
ON schema.table
|
|
86
|
-
FOR SELECT
|
|
87
|
-
TO authenticated
|
|
88
|
-
USING (
|
|
89
|
-
EXISTS (
|
|
90
|
-
SELECT 1 FROM public.profiles
|
|
91
|
-
WHERE profiles.id = auth.uid()
|
|
92
|
-
AND profiles.role = 'fund_manager'
|
|
93
|
-
)
|
|
94
|
-
);
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
#### Pattern C: Fund-Scoped Multi-Tenancy
|
|
98
|
-
|
|
99
|
-
```sql
|
|
100
|
-
-- Policy: Users see data from their funds only
|
|
101
|
-
CREATE POLICY "Users see own fund data"
|
|
102
|
-
ON schema.table
|
|
103
|
-
FOR SELECT
|
|
104
|
-
TO authenticated
|
|
105
|
-
USING (
|
|
106
|
-
fund_id IN (
|
|
107
|
-
SELECT fund_id FROM user_fund_access
|
|
108
|
-
WHERE user_id = auth.uid()
|
|
109
|
-
)
|
|
110
|
-
);
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
#### Pattern D: Insert with Service Role
|
|
114
|
-
|
|
115
|
-
```sql
|
|
116
|
-
-- Policy: Service role can insert (for automated processes)
|
|
117
|
-
CREATE POLICY "Service role can insert"
|
|
118
|
-
ON schema.table
|
|
119
|
-
FOR INSERT
|
|
120
|
-
TO authenticated
|
|
121
|
-
WITH CHECK (true);
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
### Step 4: Test Policies
|
|
127
|
-
|
|
128
|
-
**Test matrix:**
|
|
129
|
-
|
|
130
|
-
| User Type | Can Read? | Can Write? | Expected Result |
|
|
131
|
-
|-----------|-----------|------------|-----------------|
|
|
132
|
-
| Owner | ✓ | ✓ | See own data only |
|
|
133
|
-
| Fund Manager | ✓ | ✓ | See all fund data |
|
|
134
|
-
| Other User | ✗ | ✗ | No access |
|
|
135
|
-
| Anonymous | ✗ | ✗ | No access |
|
|
136
|
-
|
|
137
|
-
**Testing approach:**
|
|
138
|
-
|
|
139
|
-
1. Create test users with different roles
|
|
140
|
-
2. Attempt access with each role
|
|
141
|
-
3. Verify policies enforce expected behavior
|
|
142
|
-
|
|
143
|
-
```sql
|
|
144
|
-
-- Test as specific user
|
|
145
|
-
SET LOCAL role authenticated;
|
|
146
|
-
SET LOCAL request.jwt.claims.sub = '{user_id}';
|
|
147
|
-
|
|
148
|
-
-- Run query
|
|
149
|
-
SELECT * FROM schema.table;
|
|
150
|
-
|
|
151
|
-
-- Reset
|
|
152
|
-
RESET role;
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
### Step 5: Document Policies
|
|
158
|
-
|
|
159
|
-
**Add policy documentation:**
|
|
160
|
-
|
|
161
|
-
```sql
|
|
162
|
-
COMMENT ON POLICY "Policy name" ON schema.table IS
|
|
163
|
-
'Description of who can access and why';
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
## Security Checklist
|
|
169
|
-
|
|
170
|
-
Before deploying RLS policies:
|
|
171
|
-
|
|
172
|
-
- [ ] RLS enabled on all sensitive tables?
|
|
173
|
-
- [ ] Policies cover all operations (SELECT, INSERT, UPDATE, DELETE)?
|
|
174
|
-
- [ ] Tested with different user roles?
|
|
175
|
-
- [ ] No `WITH CHECK (true)` without justification?
|
|
176
|
-
- [ ] Service roles explicitly documented?
|
|
177
|
-
- [ ] Policies reference `auth.uid()` correctly?
|
|
178
|
-
- [ ] Multi-tenancy enforced at data level?
|
|
179
|
-
|
|
180
|
-
---
|
|
181
|
-
|
|
182
|
-
## Common Pitfalls
|
|
183
|
-
|
|
184
|
-
### ❌ WRONG: Missing WITH CHECK
|
|
185
|
-
|
|
186
|
-
```sql
|
|
187
|
-
-- Allows users to UPDATE to claim data they don't own
|
|
188
|
-
CREATE POLICY "Users update own data"
|
|
189
|
-
ON schema.table
|
|
190
|
-
FOR UPDATE
|
|
191
|
-
TO authenticated
|
|
192
|
-
USING (user_id = auth.uid());
|
|
193
|
-
-- Missing: WITH CHECK (user_id = auth.uid())
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### ✅ CORRECT: Enforce ownership on write
|
|
197
|
-
|
|
198
|
-
```sql
|
|
199
|
-
CREATE POLICY "Users update own data"
|
|
200
|
-
ON schema.table
|
|
201
|
-
FOR UPDATE
|
|
202
|
-
TO authenticated
|
|
203
|
-
USING (user_id = auth.uid())
|
|
204
|
-
WITH CHECK (user_id = auth.uid());
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
### ❌ WRONG: Exposed service operations
|
|
208
|
-
|
|
209
|
-
```sql
|
|
210
|
-
-- Too permissive - allows anyone to insert
|
|
211
|
-
CREATE POLICY "Allow insert"
|
|
212
|
-
ON schema.table
|
|
213
|
-
FOR INSERT
|
|
214
|
-
TO authenticated
|
|
215
|
-
WITH CHECK (true);
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### ✅ CORRECT: Document and limit
|
|
219
|
-
|
|
220
|
-
```sql
|
|
221
|
-
-- Only specific operations should allow unrestricted insert
|
|
222
|
-
CREATE POLICY "Service role can insert for registration"
|
|
223
|
-
ON public.profiles
|
|
224
|
-
FOR INSERT
|
|
225
|
-
TO authenticated
|
|
226
|
-
WITH CHECK (true);
|
|
227
|
-
-- Document: Required for user registration flow
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
---
|
|
231
|
-
|
|
232
|
-
## Reference
|
|
233
|
-
|
|
234
|
-
**Existing RLS examples:**
|
|
235
|
-
- `backend/migrations/20251203_create_profiles_and_app_role.sql`
|
|
236
|
-
- `backend/migrations/20251129_multi_fund_architecture.sql`
|
|
237
|
-
|
|
238
|
-
**Supabase client:**
|
|
239
|
-
- Client enforces RLS: `lib/supabaseClient.ts` (uses anon key)
|
|
240
|
-
- Service role bypasses RLS: Only for admin operations
|
|
241
|
-
|
|
242
|
-
**See also:**
|
|
243
|
-
- `workflows/migration-workflow.md` for creating migrations with RLS
|
|
244
|
-
- `references/best-practices.md` for security guidelines
|
|
1
|
+
# Row Level Security (RLS) Policy Design
|
|
2
|
+
|
|
3
|
+
Systematic approach to designing and implementing secure RLS policies in Supabase.
|
|
4
|
+
|
|
5
|
+
## When To Use
|
|
6
|
+
|
|
7
|
+
- Creating new tables with sensitive data
|
|
8
|
+
- Implementing multi-tenancy
|
|
9
|
+
- Setting up role-based access control
|
|
10
|
+
- Reviewing security requirements
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Prerequisites
|
|
15
|
+
|
|
16
|
+
- [ ] Understand data access requirements
|
|
17
|
+
- [ ] Know user roles and permissions
|
|
18
|
+
- [ ] Have auth.uid() available (Supabase auth enabled)
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Workflow
|
|
23
|
+
|
|
24
|
+
### Step 1: Define Access Requirements
|
|
25
|
+
|
|
26
|
+
**Questions to answer:**
|
|
27
|
+
|
|
28
|
+
1. **Who can READ this data?**
|
|
29
|
+
- Own data only?
|
|
30
|
+
- All users in same fund?
|
|
31
|
+
- Fund managers only?
|
|
32
|
+
- Public data?
|
|
33
|
+
|
|
34
|
+
2. **Who can WRITE (INSERT/UPDATE/DELETE)?**
|
|
35
|
+
- Owner only?
|
|
36
|
+
- Fund managers?
|
|
37
|
+
- System/service role only?
|
|
38
|
+
|
|
39
|
+
3. **What's the ownership model?**
|
|
40
|
+
- User-owned (profiles, preferences)
|
|
41
|
+
- Fund-owned (investments, transactions)
|
|
42
|
+
- Shared (multi-tenancy)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
### Step 2: Enable RLS on Table
|
|
47
|
+
|
|
48
|
+
```sql
|
|
49
|
+
-- Always enable RLS first
|
|
50
|
+
ALTER TABLE schema.table ENABLE ROW LEVEL SECURITY;
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
> **Critical:** Without RLS enabled, data is publicly accessible!
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Step 3: Implement Policies
|
|
58
|
+
|
|
59
|
+
**Choose the appropriate pattern:**
|
|
60
|
+
|
|
61
|
+
#### Pattern A: User Owns Data
|
|
62
|
+
|
|
63
|
+
```sql
|
|
64
|
+
-- Policy: Users can view own data
|
|
65
|
+
CREATE POLICY "Users can view own data"
|
|
66
|
+
ON schema.table
|
|
67
|
+
FOR SELECT
|
|
68
|
+
TO authenticated
|
|
69
|
+
USING (user_id = auth.uid());
|
|
70
|
+
|
|
71
|
+
-- Policy: Users can update own data
|
|
72
|
+
CREATE POLICY "Users can update own data"
|
|
73
|
+
ON schema.table
|
|
74
|
+
FOR UPDATE
|
|
75
|
+
TO authenticated
|
|
76
|
+
USING (user_id = auth.uid())
|
|
77
|
+
WITH CHECK (user_id = auth.uid());
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
#### Pattern B: Role-Based Access
|
|
81
|
+
|
|
82
|
+
```sql
|
|
83
|
+
-- Policy: Fund Managers can view all
|
|
84
|
+
CREATE POLICY "Fund Managers can view all"
|
|
85
|
+
ON schema.table
|
|
86
|
+
FOR SELECT
|
|
87
|
+
TO authenticated
|
|
88
|
+
USING (
|
|
89
|
+
EXISTS (
|
|
90
|
+
SELECT 1 FROM public.profiles
|
|
91
|
+
WHERE profiles.id = auth.uid()
|
|
92
|
+
AND profiles.role = 'fund_manager'
|
|
93
|
+
)
|
|
94
|
+
);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
#### Pattern C: Fund-Scoped Multi-Tenancy
|
|
98
|
+
|
|
99
|
+
```sql
|
|
100
|
+
-- Policy: Users see data from their funds only
|
|
101
|
+
CREATE POLICY "Users see own fund data"
|
|
102
|
+
ON schema.table
|
|
103
|
+
FOR SELECT
|
|
104
|
+
TO authenticated
|
|
105
|
+
USING (
|
|
106
|
+
fund_id IN (
|
|
107
|
+
SELECT fund_id FROM user_fund_access
|
|
108
|
+
WHERE user_id = auth.uid()
|
|
109
|
+
)
|
|
110
|
+
);
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
#### Pattern D: Insert with Service Role
|
|
114
|
+
|
|
115
|
+
```sql
|
|
116
|
+
-- Policy: Service role can insert (for automated processes)
|
|
117
|
+
CREATE POLICY "Service role can insert"
|
|
118
|
+
ON schema.table
|
|
119
|
+
FOR INSERT
|
|
120
|
+
TO authenticated
|
|
121
|
+
WITH CHECK (true);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### Step 4: Test Policies
|
|
127
|
+
|
|
128
|
+
**Test matrix:**
|
|
129
|
+
|
|
130
|
+
| User Type | Can Read? | Can Write? | Expected Result |
|
|
131
|
+
|-----------|-----------|------------|-----------------|
|
|
132
|
+
| Owner | ✓ | ✓ | See own data only |
|
|
133
|
+
| Fund Manager | ✓ | ✓ | See all fund data |
|
|
134
|
+
| Other User | ✗ | ✗ | No access |
|
|
135
|
+
| Anonymous | ✗ | ✗ | No access |
|
|
136
|
+
|
|
137
|
+
**Testing approach:**
|
|
138
|
+
|
|
139
|
+
1. Create test users with different roles
|
|
140
|
+
2. Attempt access with each role
|
|
141
|
+
3. Verify policies enforce expected behavior
|
|
142
|
+
|
|
143
|
+
```sql
|
|
144
|
+
-- Test as specific user
|
|
145
|
+
SET LOCAL role authenticated;
|
|
146
|
+
SET LOCAL request.jwt.claims.sub = '{user_id}';
|
|
147
|
+
|
|
148
|
+
-- Run query
|
|
149
|
+
SELECT * FROM schema.table;
|
|
150
|
+
|
|
151
|
+
-- Reset
|
|
152
|
+
RESET role;
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
### Step 5: Document Policies
|
|
158
|
+
|
|
159
|
+
**Add policy documentation:**
|
|
160
|
+
|
|
161
|
+
```sql
|
|
162
|
+
COMMENT ON POLICY "Policy name" ON schema.table IS
|
|
163
|
+
'Description of who can access and why';
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Security Checklist
|
|
169
|
+
|
|
170
|
+
Before deploying RLS policies:
|
|
171
|
+
|
|
172
|
+
- [ ] RLS enabled on all sensitive tables?
|
|
173
|
+
- [ ] Policies cover all operations (SELECT, INSERT, UPDATE, DELETE)?
|
|
174
|
+
- [ ] Tested with different user roles?
|
|
175
|
+
- [ ] No `WITH CHECK (true)` without justification?
|
|
176
|
+
- [ ] Service roles explicitly documented?
|
|
177
|
+
- [ ] Policies reference `auth.uid()` correctly?
|
|
178
|
+
- [ ] Multi-tenancy enforced at data level?
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Common Pitfalls
|
|
183
|
+
|
|
184
|
+
### ❌ WRONG: Missing WITH CHECK
|
|
185
|
+
|
|
186
|
+
```sql
|
|
187
|
+
-- Allows users to UPDATE to claim data they don't own
|
|
188
|
+
CREATE POLICY "Users update own data"
|
|
189
|
+
ON schema.table
|
|
190
|
+
FOR UPDATE
|
|
191
|
+
TO authenticated
|
|
192
|
+
USING (user_id = auth.uid());
|
|
193
|
+
-- Missing: WITH CHECK (user_id = auth.uid())
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### ✅ CORRECT: Enforce ownership on write
|
|
197
|
+
|
|
198
|
+
```sql
|
|
199
|
+
CREATE POLICY "Users update own data"
|
|
200
|
+
ON schema.table
|
|
201
|
+
FOR UPDATE
|
|
202
|
+
TO authenticated
|
|
203
|
+
USING (user_id = auth.uid())
|
|
204
|
+
WITH CHECK (user_id = auth.uid());
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### ❌ WRONG: Exposed service operations
|
|
208
|
+
|
|
209
|
+
```sql
|
|
210
|
+
-- Too permissive - allows anyone to insert
|
|
211
|
+
CREATE POLICY "Allow insert"
|
|
212
|
+
ON schema.table
|
|
213
|
+
FOR INSERT
|
|
214
|
+
TO authenticated
|
|
215
|
+
WITH CHECK (true);
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### ✅ CORRECT: Document and limit
|
|
219
|
+
|
|
220
|
+
```sql
|
|
221
|
+
-- Only specific operations should allow unrestricted insert
|
|
222
|
+
CREATE POLICY "Service role can insert for registration"
|
|
223
|
+
ON public.profiles
|
|
224
|
+
FOR INSERT
|
|
225
|
+
TO authenticated
|
|
226
|
+
WITH CHECK (true);
|
|
227
|
+
-- Document: Required for user registration flow
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Reference
|
|
233
|
+
|
|
234
|
+
**Existing RLS examples:**
|
|
235
|
+
- `backend/migrations/20251203_create_profiles_and_app_role.sql`
|
|
236
|
+
- `backend/migrations/20251129_multi_fund_architecture.sql`
|
|
237
|
+
|
|
238
|
+
**Supabase client:**
|
|
239
|
+
- Client enforces RLS: `lib/supabaseClient.ts` (uses anon key)
|
|
240
|
+
- Service role bypasses RLS: Only for admin operations
|
|
241
|
+
|
|
242
|
+
**See also:**
|
|
243
|
+
- `workflows/migration-workflow.md` for creating migrations with RLS
|
|
244
|
+
- `references/best-practices.md` for security guidelines
|