Skip to content

Commit d8b242f

Browse files
committed
Add variable substitution in RLS filters and update owner role
Introduced a method to resolve variables like $user.id in row-level security filters within SecurityEngine. Updated the owner role to use a filter referencing $user.spaceId for organization permissions.
1 parent 395528d commit d8b242f

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

packages/core/src/security.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,26 @@ export class SecurityEngine {
130130
return resolved;
131131
}
132132

133+
/**
134+
* Resolves variables in filters like $user.id
135+
*/
136+
private resolveFilters(filters: any[], user: any): any[] {
137+
if (!filters || !Array.isArray(filters)) return filters;
138+
139+
return filters.map(item => {
140+
if (Array.isArray(item)) {
141+
return this.resolveFilters(item, user);
142+
}
143+
144+
if (typeof item === 'string' && item.startsWith('$user.')) {
145+
const prop = item.substring(6); // remove '$user.'
146+
return user ? user[prop] : null;
147+
}
148+
149+
return item;
150+
});
151+
}
152+
133153
/**
134154
* Checks if the operation is allowed and returns the RLS filters to apply.
135155
*/
@@ -152,10 +172,13 @@ export class SecurityEngine {
152172
// Construct final RLS filter
153173
let finalFilter = undefined;
154174
if (perm.filters && perm.filters.length > 0) {
155-
if (perm.filters.length === 1) {
156-
finalFilter = perm.filters[0];
175+
// Variable Substitution
176+
const resolved = this.resolveFilters(perm.filters, ctx.user);
177+
178+
if (resolved.length === 1) {
179+
finalFilter = resolved[0];
157180
} else {
158-
finalFilter = ['or', ...perm.filters];
181+
finalFilter = ['or', ...resolved];
159182
}
160183
}
161184

packages/platform/src/roles/owner.role.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ policies: []
55
permissions:
66
organization:
77
actions: [read, update, delete]
8+
filters:
9+
- ['id', '=', '$user.spaceId']
810
user:
911
actions: [read]
1012
member:

0 commit comments

Comments
 (0)