@venizia/ignis 0.2.0-5 → 0.2.0-7
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/dist/components/auth/authenticate/services/service/verifier.service.d.ts.map +1 -1
- package/dist/components/auth/authenticate/services/service/verifier.service.js +10 -6
- package/dist/components/auth/authenticate/services/service/verifier.service.js.map +1 -1
- package/dist/components/auth/authorize/adapters/base-filtered.d.ts.map +1 -1
- package/dist/components/auth/authorize/adapters/base-filtered.js +5 -8
- package/dist/components/auth/authorize/adapters/base-filtered.js.map +1 -1
- package/dist/components/auth/authorize/adapters/connector.d.ts +10 -0
- package/dist/components/auth/authorize/adapters/connector.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/connector.js +20 -0
- package/dist/components/auth/authorize/adapters/connector.js.map +1 -0
- package/dist/components/auth/authorize/adapters/custom-grant-expander.d.ts +52 -0
- package/dist/components/auth/authorize/adapters/custom-grant-expander.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/custom-grant-expander.js +111 -0
- package/dist/components/auth/authorize/adapters/custom-grant-expander.js.map +1 -0
- package/dist/components/auth/authorize/adapters/index.d.ts +2 -0
- package/dist/components/auth/authorize/adapters/index.d.ts.map +1 -1
- package/dist/components/auth/authorize/adapters/index.js +2 -0
- package/dist/components/auth/authorize/adapters/index.js.map +1 -1
- package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.d.ts +53 -37
- package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.d.ts.map +1 -1
- package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.js +69 -76
- package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.js.map +1 -1
- package/dist/components/auth/authorize/component.d.ts.map +1 -1
- package/dist/components/auth/authorize/component.js +3 -0
- package/dist/components/auth/authorize/component.js.map +1 -1
- package/dist/components/auth/authorize/enforcers/casbin.enforcer.d.ts +7 -36
- package/dist/components/auth/authorize/enforcers/casbin.enforcer.d.ts.map +1 -1
- package/dist/components/auth/authorize/enforcers/casbin.enforcer.js +48 -117
- package/dist/components/auth/authorize/enforcers/casbin.enforcer.js.map +1 -1
- package/dist/components/auth/authorize/enforcers/index.d.ts +2 -1
- package/dist/components/auth/authorize/enforcers/index.d.ts.map +1 -1
- package/dist/components/auth/authorize/enforcers/index.js +2 -1
- package/dist/components/auth/authorize/enforcers/index.js.map +1 -1
- package/dist/components/auth/authorize/enforcers/policy-line-codec.d.ts +26 -0
- package/dist/components/auth/authorize/enforcers/policy-line-codec.d.ts.map +1 -0
- package/dist/components/auth/authorize/enforcers/policy-line-codec.js +57 -0
- package/dist/components/auth/authorize/enforcers/policy-line-codec.js.map +1 -0
- package/dist/components/auth/authorize/enforcers/user-policy-line-cache.d.ts +46 -0
- package/dist/components/auth/authorize/enforcers/user-policy-line-cache.d.ts.map +1 -0
- package/dist/components/auth/authorize/enforcers/user-policy-line-cache.js +98 -0
- package/dist/components/auth/authorize/enforcers/user-policy-line-cache.js.map +1 -0
- package/dist/components/auth/authorize/index.d.ts +1 -0
- package/dist/components/auth/authorize/index.d.ts.map +1 -1
- package/dist/components/auth/authorize/index.js +1 -0
- package/dist/components/auth/authorize/index.js.map +1 -1
- package/dist/components/auth/authorize/role-managers/base.d.ts +34 -0
- package/dist/components/auth/authorize/role-managers/base.d.ts.map +1 -0
- package/dist/components/auth/authorize/role-managers/base.js +76 -0
- package/dist/components/auth/authorize/role-managers/base.js.map +1 -0
- package/dist/components/auth/authorize/role-managers/domain-hierarchy.d.ts +28 -0
- package/dist/components/auth/authorize/role-managers/domain-hierarchy.d.ts.map +1 -0
- package/dist/components/auth/authorize/role-managers/domain-hierarchy.js +77 -0
- package/dist/components/auth/authorize/role-managers/domain-hierarchy.js.map +1 -0
- package/dist/components/auth/authorize/role-managers/index.d.ts +5 -0
- package/dist/components/auth/authorize/role-managers/index.d.ts.map +1 -0
- package/dist/components/auth/authorize/role-managers/index.js +21 -0
- package/dist/components/auth/authorize/role-managers/index.js.map +1 -0
- package/dist/components/auth/authorize/role-managers/membership.d.ts +21 -0
- package/dist/components/auth/authorize/role-managers/membership.d.ts.map +1 -0
- package/dist/components/auth/authorize/role-managers/membership.js +69 -0
- package/dist/components/auth/authorize/role-managers/membership.js.map +1 -0
- package/dist/components/auth/authorize/{enforcers/resource-role-manager.d.ts → role-managers/resource.d.ts} +3 -9
- package/dist/components/auth/authorize/role-managers/resource.d.ts.map +1 -0
- package/dist/components/auth/authorize/{enforcers/resource-role-manager.js → role-managers/resource.js} +9 -21
- package/dist/components/auth/authorize/role-managers/resource.js.map +1 -0
- package/dist/components/auth/models/entities/policy-definition.model.d.ts +28 -14
- package/dist/components/auth/models/entities/policy-definition.model.d.ts.map +1 -1
- package/dist/components/auth/models/entities/policy-definition.model.js +18 -10
- package/dist/components/auth/models/entities/policy-definition.model.js.map +1 -1
- package/package.json +8 -8
- package/dist/components/auth/authorize/enforcers/resource-role-manager.d.ts.map +0 -1
- package/dist/components/auth/authorize/enforcers/resource-role-manager.js.map +0 -1
|
@@ -5,6 +5,7 @@ const drizzle_orm_1 = require("drizzle-orm");
|
|
|
5
5
|
const ignis_kernel_1 = require("@venizia/ignis-kernel");
|
|
6
6
|
const ignis_kernel_2 = require("@venizia/ignis-kernel");
|
|
7
7
|
const base_filtered_1 = require("./base-filtered");
|
|
8
|
+
const custom_grant_expander_1 = require("./custom-grant-expander");
|
|
8
9
|
class PrincipalPolicyEdges {
|
|
9
10
|
static { this.DIRECT = 'direct'; }
|
|
10
11
|
static { this.ROLE_EDGE = 'roleEdge'; }
|
|
@@ -13,23 +14,42 @@ class PrincipalPolicyEdges {
|
|
|
13
14
|
}
|
|
14
15
|
exports.PrincipalPolicyEdges = PrincipalPolicyEdges;
|
|
15
16
|
const DEFAULT_SCHEMA = 'public';
|
|
16
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Filtered casbin adapter for the scoped RBAC model: loads ONE principal's edges (role assignments,
|
|
19
|
+
* memberships, grants) plus the shared structural hierarchy trees as casbin lines. Read-only.
|
|
20
|
+
*
|
|
21
|
+
* EVERY branch below must select by `variant = <known value>` or `variant IN (<known values>)`.
|
|
22
|
+
* Never `variant NOT IN (...)`, and never a bare select that classifies afterwards. Applications
|
|
23
|
+
* store their own edge kinds in this same table (declared via `extraVariants`), and an exclusion
|
|
24
|
+
* filter would sweep those unknown rows into a branch that has no idea what they mean. The current
|
|
25
|
+
* shape makes an undeclared variant inert, which is what makes sharing the table safe.
|
|
26
|
+
*/
|
|
17
27
|
class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
18
28
|
constructor(opts) {
|
|
19
29
|
super({ scope: ScopedCasbinAdapter.name, dataSource: opts.dataSource });
|
|
20
30
|
this.entities = opts.entities;
|
|
31
|
+
this.resolveDomainEdges = opts.resolveDomainEdges;
|
|
32
|
+
this.customGrantExpander = new custom_grant_expander_1.CustomGrantExpander({
|
|
33
|
+
dataSource: opts.dataSource,
|
|
34
|
+
entities: { permission: opts.entities.permission, softDelete: opts.entities.softDelete },
|
|
35
|
+
});
|
|
21
36
|
}
|
|
22
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* One wave: the principal-scoped CTE and the merged structural-edges query are issued together -
|
|
39
|
+
* the role closure resolves in SQL, so neither waits on the other. `resolveDomainEdges` cannot
|
|
40
|
+
* join that wave - it needs the domain closure the principal-scoped CTE produces - but it does
|
|
41
|
+
* not wait for the structural-edges query either: both run concurrently once the closure is known.
|
|
42
|
+
*/
|
|
23
43
|
async loadFilteredPolicy(model, filter) {
|
|
24
44
|
const { principal } = filter;
|
|
25
45
|
const { principals } = this.entities;
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
]);
|
|
46
|
+
const principalPoliciesPromise = this.queryPrincipalPolicies({ principal });
|
|
47
|
+
const structuralEdgesPromise = this.queryEdgePolicies();
|
|
48
|
+
const principalRows = await principalPoliciesPromise;
|
|
30
49
|
const lines = [];
|
|
31
50
|
const directGrants = [];
|
|
32
51
|
const roleGrants = [];
|
|
52
|
+
const domainClosure = new Set();
|
|
33
53
|
for (const row of principalRows) {
|
|
34
54
|
switch (row.kind) {
|
|
35
55
|
case PrincipalPolicyEdges.ROLE_EDGE: {
|
|
@@ -42,17 +62,32 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
42
62
|
}
|
|
43
63
|
case PrincipalPolicyEdges.DOMAIN_EDGE: {
|
|
44
64
|
lines.push(`${ignis_kernel_2.AuthorizationPolicyVariants.DOMAIN_INHERITS.rule}, ${row.subjectId}, ${row.targetId}`);
|
|
65
|
+
// Both ends are, by construction, members of the principal's domain_closure CTE.
|
|
66
|
+
domainClosure.add(String(row.subjectId));
|
|
67
|
+
domainClosure.add(String(row.targetId));
|
|
45
68
|
break;
|
|
46
69
|
}
|
|
47
70
|
default: {
|
|
71
|
+
if (row.variant === ignis_kernel_2.AuthorizationPolicyVariants.JOIN_DOMAIN.action) {
|
|
72
|
+
domainClosure.add(`${row.targetType}_${row.targetId}`);
|
|
73
|
+
}
|
|
48
74
|
this.collectDirectRow({ row, principal, lines, directGrants });
|
|
49
75
|
break;
|
|
50
76
|
}
|
|
51
77
|
}
|
|
52
78
|
}
|
|
79
|
+
const hookLinesPromise = this.resolveDomainEdgeLines({
|
|
80
|
+
principal,
|
|
81
|
+
domains: [...domainClosure],
|
|
82
|
+
});
|
|
53
83
|
lines.push(...(await this.buildGrantLines({ subjectType: principal.type, rows: directGrants })));
|
|
54
84
|
lines.push(...(await this.buildGrantLines({ subjectType: principals.role, rows: roleGrants })));
|
|
85
|
+
const [structuralEdges, hookLines] = await Promise.all([
|
|
86
|
+
structuralEdgesPromise,
|
|
87
|
+
hookLinesPromise,
|
|
88
|
+
]);
|
|
55
89
|
lines.push(...structuralEdges);
|
|
90
|
+
lines.push(...hookLines);
|
|
56
91
|
await this.loadLines({ model, lines });
|
|
57
92
|
}
|
|
58
93
|
/** Route one `direct` row to its casbin line, or to the grant batch. */
|
|
@@ -80,6 +115,29 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
80
115
|
}
|
|
81
116
|
}
|
|
82
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Calls the `resolveDomainEdges` hook, if supplied, and turns its edges into `g3` lines using
|
|
120
|
+
* the same shape the DOMAIN_EDGE branch emits. A throwing hook is logged and treated as no
|
|
121
|
+
* edges - the rows already gathered for this principal still load. This is the safe direction:
|
|
122
|
+
* a missing hierarchy edge can only narrow what `g`/`g2`/`g3` reach, never widen it, so the
|
|
123
|
+
* failure degrades to less access rather than either an outage or excess access.
|
|
124
|
+
*/
|
|
125
|
+
async resolveDomainEdgeLines(opts) {
|
|
126
|
+
if (!this.resolveDomainEdges) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
let edges;
|
|
130
|
+
try {
|
|
131
|
+
edges = await this.resolveDomainEdges(opts);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
this.logger
|
|
135
|
+
.for(this.resolveDomainEdgeLines.name)
|
|
136
|
+
.error('resolveDomainEdges hook threw - continuing without its edges for this load | principal: %s_%s | error: %s', opts.principal.type, opts.principal.id, error);
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
return edges.map(edge => `${ignis_kernel_2.AuthorizationPolicyVariants.DOMAIN_INHERITS.rule}, ${edge.child}, ${edge.parent}`);
|
|
140
|
+
}
|
|
83
141
|
/** Schema for a table, defaulting to `public`. */
|
|
84
142
|
schemaOf(table) {
|
|
85
143
|
return table.schemaName ?? DEFAULT_SCHEMA;
|
|
@@ -268,7 +326,7 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
268
326
|
.error('Skipping custom grant row whose subject or method did not resolve - the target is missing or soft-deleted | subject: %s_%s | object: %s', subjectType, row.subjectId, row.objectCode);
|
|
269
327
|
continue;
|
|
270
328
|
}
|
|
271
|
-
const rejection = this.rejectCustomRow({
|
|
329
|
+
const rejection = this.customGrantExpander.rejectCustomRow({
|
|
272
330
|
row: {
|
|
273
331
|
subjectId: row.subjectId,
|
|
274
332
|
objectCode: row.objectCode,
|
|
@@ -290,78 +348,13 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
290
348
|
effect,
|
|
291
349
|
});
|
|
292
350
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
/** Why a custom-looking grant row cannot be honoured, or null when it is well formed. */
|
|
297
|
-
rejectCustomRow(opts) {
|
|
298
|
-
const { row, parsed, isCustomAction, metadataColumnName } = opts;
|
|
299
|
-
if (isCustomAction && !metadataColumnName) {
|
|
300
|
-
return `Skipping custom grant - entities.policyDefinition.metadata.columnName is not mapped, so metadata.ops cannot be read | subject id: ${row.subjectId} | object: ${row.objectCode}`;
|
|
301
|
-
}
|
|
302
|
-
if (isCustomAction && !parsed) {
|
|
303
|
-
return `Skipping custom grant - metadata.ops is missing, empty, or not an array of non-empty strings | subject id: ${row.subjectId} | object: ${row.objectCode}`;
|
|
304
|
-
}
|
|
305
|
-
if (!isCustomAction && parsed) {
|
|
306
|
-
return `Skipping grant - metadata.ops is present but action is not "${ignis_kernel_2.AuthorizationActions.CUSTOM}", so the intent is ambiguous | subject id: ${row.subjectId} | object: ${row.objectCode}`;
|
|
307
|
-
}
|
|
308
|
-
if (row.objectMethod !== ignis_kernel_1.AuthorizationPermissionBuilder.RESOURCE_NODE_METHOD) {
|
|
309
|
-
return `Skipping custom grant - the target must be a subject-level resource node | subject id: ${row.subjectId} | object: ${row.objectCode}`;
|
|
310
|
-
}
|
|
311
|
-
return null;
|
|
312
|
-
}
|
|
313
|
-
/** Resolve every custom row's ops in one catalog query, then emit one line per resolved operation. */
|
|
314
|
-
async expandCustomGrants(opts) {
|
|
315
|
-
if (!opts.customRows.length) {
|
|
316
|
-
return [];
|
|
317
|
-
}
|
|
318
|
-
const seen = new Set();
|
|
319
|
-
const pairs = [];
|
|
320
|
-
const candidates = opts.customRows.flatMap(row => row.ops.map(op => ({ subject: row.objectSubject, method: op })));
|
|
321
|
-
for (const candidate of candidates) {
|
|
322
|
-
const key = `${candidate.subject}.${candidate.method}`;
|
|
323
|
-
if (seen.has(key)) {
|
|
324
|
-
continue;
|
|
325
|
-
}
|
|
326
|
-
seen.add(key);
|
|
327
|
-
pairs.push(candidate);
|
|
328
|
-
}
|
|
329
|
-
const catalog = await this.queryOperationCatalog({ pairs });
|
|
330
|
-
const byKey = new Map(catalog.map(entry => [`${entry.subject}.${entry.method}`, entry]));
|
|
331
|
-
const lines = [];
|
|
332
|
-
for (const row of opts.customRows) {
|
|
333
|
-
const { valid, unknown } = ignis_kernel_1.GrantBuilder.getInstance().validateCustomGrantOps({
|
|
334
|
-
ops: row.ops,
|
|
335
|
-
subject: row.objectSubject,
|
|
336
|
-
catalog,
|
|
337
|
-
});
|
|
338
|
-
if (unknown.length) {
|
|
339
|
-
this.logger
|
|
340
|
-
.for(this.expandCustomGrants.name)
|
|
341
|
-
.error('Skipping unresolvable operations in a custom grant | subject id: %s | resource: %s | unknown: %s', row.subjectId, row.objectSubject, unknown.join(', '));
|
|
342
|
-
}
|
|
343
|
-
for (const op of valid) {
|
|
344
|
-
const entry = byKey.get(`${row.objectSubject}.${op}`);
|
|
345
|
-
lines.push(`${ignis_kernel_2.AuthorizationPolicyVariants.GRANT.rule}, ${opts.subjectType}_${row.subjectId}, ${row.domain}, ${entry.code}, ${entry.action}, ${row.effect}`);
|
|
346
|
-
}
|
|
351
|
+
const expanded = await this.customGrantExpander.expandCustomGrants({ subjectType, customRows });
|
|
352
|
+
for (const rejection of expanded.rejections) {
|
|
353
|
+
this.logger.for(this.buildGrantLines.name).error(rejection);
|
|
347
354
|
}
|
|
355
|
+
lines.push(...expanded.lines);
|
|
348
356
|
return lines;
|
|
349
357
|
}
|
|
350
|
-
/** Resolve `(subject, method)` pairs to catalogued operations. One query for the whole extraction. */
|
|
351
|
-
async queryOperationCatalog(opts) {
|
|
352
|
-
if (!opts.pairs.length) {
|
|
353
|
-
return [];
|
|
354
|
-
}
|
|
355
|
-
const permissionTable = this.qualifiedTable({ table: this.entities.permission });
|
|
356
|
-
return this.query({
|
|
357
|
-
statement: (0, drizzle_orm_1.sql) `
|
|
358
|
-
SELECT permission.subject, permission.method, permission.code, permission.action
|
|
359
|
-
FROM ${permissionTable} permission
|
|
360
|
-
WHERE (permission.subject, permission.method) IN (${drizzle_orm_1.sql.join(opts.pairs.map(pair => (0, drizzle_orm_1.sql) `(${pair.subject}, ${pair.method})`), (0, drizzle_orm_1.sql) `, `)})
|
|
361
|
-
AND permission.method <> ${ignis_kernel_1.AuthorizationPermissionBuilder.RESOURCE_NODE_METHOD}${this.softDeleteClause({ alias: 'permission' })}
|
|
362
|
-
`,
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
358
|
/** The two code-fixed structural trees only (`g4` resource, `g5` action) - constant regardless of tenant count. Domain edges (`g3`) grow with the domain count, so they are principal-scoped in {@link queryPrincipalPolicies} instead. */
|
|
366
359
|
async queryEdgePolicies() {
|
|
367
360
|
const { policyDefinition, permission } = this.entities;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoped-casbin.adapter.js","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/adapters/scoped-casbin.adapter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scoped-casbin.adapter.js","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/adapters/scoped-casbin.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/authorize/component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/authorize/component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAO/D,qBAAa,kBAAmB,SAAQ,aAAa;IAEG,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,eAAe;IAQjF,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC;IAsBxC,OAAO,CAAC,oBAAoB;CAS7B"}
|
|
@@ -38,6 +38,9 @@ let AuthorizeComponent = AuthorizeComponent_1 = class AuthorizeComponent extends
|
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
40
|
this.bindAlwaysAllowRoles({ options });
|
|
41
|
+
// The registry otherwise finds options only through a registered enforcer's container, so
|
|
42
|
+
// `defaultDecision` would be unreadable in the one case it decides: no enforcer registered.
|
|
43
|
+
ignis_kernel_4.AuthorizationEnforcerRegistry.getInstance().setOptions({ options });
|
|
41
44
|
this.logger.for(this.binding.name).info('Authorization configured');
|
|
42
45
|
}
|
|
43
46
|
bindAlwaysAllowRoles(opts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../src/components/auth/authorize/component.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,wDAAsD;AACtD,wDAA+C;AAC/C,wDAAqD;AACrD,sDAAuD;AAEvD,
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../src/components/auth/authorize/component.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,wDAAsD;AACtD,wDAA+C;AAC/C,wDAAqD;AACrD,sDAAuD;AAEvD,wDAI+B;AAE/B,IAAa,kBAAkB,0BAA/B,MAAa,kBAAmB,SAAQ,4BAAa;IACnD,YAC8D,WAA4B;QAExF,KAAK,CAAC;YACJ,KAAK,EAAE,oBAAkB,CAAC,IAAI;YAC9B,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE;SACtD,CAAC,CAAC;QALyD,gBAAW,GAAX,WAAW,CAAiB;IAM1F,CAAC;IAEQ,OAAO;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAoB;YACtD,GAAG,EAAE,mCAAoB,CAAC,OAAO;YACjC,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAA,eAAQ,EAAC;gBACb,OAAO,EACL,iIAAiI;aACpI,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvC,0FAA0F;QAC1F,4FAA4F;QAC5F,4CAA6B,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAEpE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACtE,CAAC;IAEO,oBAAoB,CAAC,IAAoC;QAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW;aACb,IAAI,CAAW,EAAE,GAAG,EAAE,mCAAoB,CAAC,kBAAkB,EAAE,CAAC;aAChE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC;CACF,CAAA;AAzCY,gDAAkB;6BAAlB,kBAAkB;IAE1B,WAAA,IAAA,qBAAM,EAAC,EAAE,GAAG,EAAE,2BAAY,CAAC,oBAAoB,EAAE,CAAC,CAAA;;GAF1C,kBAAkB,CAyC9B"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { TContext } from '@venizia/ignis-kernel';
|
|
2
2
|
import { BaseHelper } from '@venizia/ignis-helpers/core';
|
|
3
|
-
import { TNullable } from '@venizia/ignis-helpers/common';
|
|
4
3
|
import type { Enforcer as CasbinEnforcerType } from 'casbin';
|
|
5
4
|
import { Env } from 'hono';
|
|
6
|
-
import { IAuthorizationEnforcer, IAuthorizationUser,
|
|
5
|
+
import { IAuthorizationEnforcer, IAuthorizationUser, ICasbinEnforcerOptions, ICasbinRules, type IAuthorizationRequest, type TAuthorizationDecision, type TCasbinDomainMatchingFunction } from '@venizia/ignis-kernel';
|
|
6
|
+
import { UserPolicyLineCache } from './user-policy-line-cache';
|
|
7
7
|
/** Payload shape for the scoped/custom path, matching defaultScopedPayloadFn(). */
|
|
8
8
|
type TNormalizePayloadFn<E extends Env, TAction, TResource> = (opts: {
|
|
9
9
|
user: IAuthorizationUser;
|
|
@@ -22,7 +22,7 @@ export declare class CasbinAuthorizationEnforcer<E extends Env = Env, TAction ex
|
|
|
22
22
|
private readonly MIN_EXPIRES_IN;
|
|
23
23
|
private pool;
|
|
24
24
|
private helper;
|
|
25
|
-
private
|
|
25
|
+
private userPolicyLineCache;
|
|
26
26
|
private resolvedPayloadFn;
|
|
27
27
|
constructor(options: ICasbinEnforcerOptions<E, TAction, TResource>);
|
|
28
28
|
configure(): Promise<void>;
|
|
@@ -56,17 +56,8 @@ export declare class CasbinAuthorizationEnforcer<E extends Env = Env, TAction ex
|
|
|
56
56
|
cacheKey: string;
|
|
57
57
|
lineCount: number;
|
|
58
58
|
}>;
|
|
59
|
-
/**
|
|
60
|
-
protected
|
|
61
|
-
user: IAuthorizationUser;
|
|
62
|
-
cached: ICasbinEnforcerCachedRedis & {
|
|
63
|
-
use: true;
|
|
64
|
-
};
|
|
65
|
-
}): Promise<string>;
|
|
66
|
-
/** Narrow `options.cached` to the redis variant; cache management is redis-only. */
|
|
67
|
-
protected requireRedisCache(): ICasbinEnforcerCachedRedis & {
|
|
68
|
-
use: true;
|
|
69
|
-
};
|
|
59
|
+
/** Narrow `options.cached` to the redis variant and lazily create the per-user line cache - memoized so its single-flight de-dup map is shared across calls rather than reset on every access. */
|
|
60
|
+
protected requireRedisCache(): UserPolicyLineCache;
|
|
70
61
|
protected registerMatchers(opts: {
|
|
71
62
|
enforcer: CasbinEnforcerType;
|
|
72
63
|
casbin: typeof import('casbin');
|
|
@@ -85,31 +76,11 @@ export declare class CasbinAuthorizationEnforcer<E extends Env = Env, TAction ex
|
|
|
85
76
|
protected validateExpiresIn(opts: {
|
|
86
77
|
expiresIn: number;
|
|
87
78
|
}): void;
|
|
88
|
-
/**
|
|
89
|
-
protected fetchLinesWithRedisCache(opts: {
|
|
90
|
-
user: IAuthorizationUser;
|
|
91
|
-
cached: ICasbinEnforcerCachedRedis & {
|
|
92
|
-
use: true;
|
|
93
|
-
};
|
|
94
|
-
}): Promise<string[]>;
|
|
95
|
-
/** Single source of truth for the Redis cache encoding. Used by miss-path and rebuild. */
|
|
96
|
-
protected writeCachedPolicyLines(opts: {
|
|
97
|
-
cacheKey: string;
|
|
98
|
-
lines: string[];
|
|
99
|
-
options: ICasbinEnforcerCachedRedis['options'];
|
|
100
|
-
}): Promise<void>;
|
|
101
|
-
/** Decode cached policy lines; on any corruption, log and return null so the caller refetches. */
|
|
102
|
-
protected parseCachedPolicyLines(opts: {
|
|
103
|
-
raw: string;
|
|
104
|
-
cacheKey: string;
|
|
105
|
-
}): TNullable<string[]>;
|
|
106
|
-
/** Extract a user's lines from an ISOLATED throwaway enforcer (own model + adapter), never a pooled serving one, so concurrent requests cannot change what we cache. */
|
|
79
|
+
/** Resolves this enforcer's model, then delegates the isolated-enforcer extraction (own model + adapter, never a pooled serving one, so concurrent requests cannot change what we cache) to PolicyLineCodec. */
|
|
107
80
|
protected extractUserLines(opts: {
|
|
108
81
|
user: IAuthorizationUser;
|
|
109
82
|
}): Promise<string[]>;
|
|
110
|
-
/**
|
|
111
|
-
protected extractLinesFrom(enforcer: CasbinEnforcerType): Promise<string[]>;
|
|
112
|
-
/** Atomically reset a borrowed enforcer's model to exactly `lines` + rebuild role links. */
|
|
83
|
+
/** Requires configure() to have resolved the casbin Helper; the clearPolicy + loadPolicyLine + buildRoleLinks ordering lives in PolicyLineCodec. */
|
|
113
84
|
protected loadPolicyLinesIntoModel(opts: {
|
|
114
85
|
enforcer: CasbinEnforcerType;
|
|
115
86
|
lines: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"casbin.enforcer.d.ts","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/enforcers/casbin.enforcer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAA4B,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"casbin.enforcer.d.ts","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/enforcers/casbin.enforcer.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,11 @@ const ignis_kernel_1 = require("@venizia/ignis-kernel");
|
|
|
18
18
|
const core_1 = require("@venizia/ignis-helpers/core");
|
|
19
19
|
const ignis_kernel_2 = require("@venizia/ignis-kernel");
|
|
20
20
|
const ignis_kernel_3 = require("@venizia/ignis-kernel");
|
|
21
|
-
const
|
|
21
|
+
const domain_hierarchy_1 = require("../role-managers/domain-hierarchy");
|
|
22
|
+
const membership_1 = require("../role-managers/membership");
|
|
23
|
+
const resource_1 = require("../role-managers/resource");
|
|
24
|
+
const policy_line_codec_1 = require("./policy-line-codec");
|
|
25
|
+
const user_policy_line_cache_1 = require("./user-policy-line-cache");
|
|
22
26
|
// Wraps casbin (optional peer dep). Each request borrows its own pooled enforcer; any error during use destroys it (fail-closed). Pooled enforcers carry no adapter - only extractUserLines uses one.
|
|
23
27
|
let CasbinAuthorizationEnforcer = CasbinAuthorizationEnforcer_1 = class CasbinAuthorizationEnforcer extends core_1.BaseHelper {
|
|
24
28
|
constructor(options) {
|
|
@@ -28,8 +32,8 @@ let CasbinAuthorizationEnforcer = CasbinAuthorizationEnforcer_1 = class CasbinAu
|
|
|
28
32
|
this.MIN_EXPIRES_IN = 10_000;
|
|
29
33
|
this.pool = null;
|
|
30
34
|
this.helper = null;
|
|
31
|
-
//
|
|
32
|
-
this.
|
|
35
|
+
// Lazily created on first cache use (see requireRedisCache) - one instance for the enforcer's lifetime so its single-flight de-dup map actually dedupes.
|
|
36
|
+
this.userPolicyLineCache = null;
|
|
33
37
|
// Memoized in configure() (options are fixed after) to avoid rebuilding this closure on every evaluate() (hot path).
|
|
34
38
|
this.resolvedPayloadFn = null;
|
|
35
39
|
}
|
|
@@ -97,7 +101,7 @@ let CasbinAuthorizationEnforcer = CasbinAuthorizationEnforcer_1 = class CasbinAu
|
|
|
97
101
|
const { user } = opts;
|
|
98
102
|
const cached = this.options.cached;
|
|
99
103
|
const lines = cached.use
|
|
100
|
-
? await this.
|
|
104
|
+
? await this.requireRedisCache().fetch({ user })
|
|
101
105
|
: await this.extractUserLines({ user });
|
|
102
106
|
return { user, lines };
|
|
103
107
|
}
|
|
@@ -156,38 +160,23 @@ let CasbinAuthorizationEnforcer = CasbinAuthorizationEnforcer_1 = class CasbinAu
|
|
|
156
160
|
}
|
|
157
161
|
// Cache management - optional IAuthorizationEnforcer members (on-demand)
|
|
158
162
|
async invalidateUserCache(opts) {
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
163
|
+
const { cacheKey, invalidatedKeys } = await this.requireRedisCache().invalidate({
|
|
164
|
+
user: opts.user,
|
|
165
|
+
});
|
|
162
166
|
this.logger
|
|
163
167
|
.for(this.invalidateUserCache.name)
|
|
164
168
|
.info('Invalidated authz cache | user: %s | key: %s | deleted: %s', opts.user.userId, cacheKey, invalidatedKeys);
|
|
165
169
|
return { invalidatedKeys };
|
|
166
170
|
}
|
|
167
171
|
async rebuildUserCache(opts) {
|
|
168
|
-
const cached = this.requireRedisCache();
|
|
169
172
|
// Extraction runs on an isolated throwaway enforcer (not a serving model), so a concurrent request cannot make us cache another user's policies under this key.
|
|
170
|
-
const cacheKey = await this.
|
|
171
|
-
await cached.options.connection.del({ keys: [cacheKey] });
|
|
172
|
-
const lines = await this.extractUserLines({ user: opts.user });
|
|
173
|
-
await this.writeCachedPolicyLines({ cacheKey, lines, options: cached.options });
|
|
173
|
+
const { cacheKey, lines } = await this.requireRedisCache().rebuild({ user: opts.user });
|
|
174
174
|
this.logger
|
|
175
175
|
.for(this.rebuildUserCache.name)
|
|
176
176
|
.info('Rebuilt authz cache | user: %s | key: %s | lines: %s', opts.user.userId, cacheKey, lines.length);
|
|
177
177
|
return { cacheKey, lineCount: lines.length };
|
|
178
178
|
}
|
|
179
|
-
/**
|
|
180
|
-
async resolveCacheKey(opts) {
|
|
181
|
-
const cacheKey = await opts.cached.options.keyFn({ user: opts.user });
|
|
182
|
-
if (!cacheKey) {
|
|
183
|
-
throw (0, core_1.getError)({
|
|
184
|
-
error: ignis_kernel_3.AuthorizationErrors.CACHE_KEY_INVALID,
|
|
185
|
-
message: '[CasbinAuthorizationEnforcer] keyFn returned an empty cache key.',
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
return cacheKey;
|
|
189
|
-
}
|
|
190
|
-
/** Narrow `options.cached` to the redis variant; cache management is redis-only. */
|
|
179
|
+
/** Narrow `options.cached` to the redis variant and lazily create the per-user line cache - memoized so its single-flight de-dup map is shared across calls rather than reset on every access. */
|
|
191
180
|
requireRedisCache() {
|
|
192
181
|
const { cached } = this.options;
|
|
193
182
|
if (!cached.use) {
|
|
@@ -195,7 +184,10 @@ let CasbinAuthorizationEnforcer = CasbinAuthorizationEnforcer_1 = class CasbinAu
|
|
|
195
184
|
message: '[CasbinAuthorizationEnforcer] Cache management requires the redis cache driver, but caching is disabled.',
|
|
196
185
|
});
|
|
197
186
|
}
|
|
198
|
-
return
|
|
187
|
+
return (this.userPolicyLineCache ??= new user_policy_line_cache_1.UserPolicyLineCache({
|
|
188
|
+
cached,
|
|
189
|
+
loadLines: opts => this.extractUserLines(opts),
|
|
190
|
+
}));
|
|
199
191
|
}
|
|
200
192
|
// Matchers & model resolvers
|
|
201
193
|
async registerMatchers(opts) {
|
|
@@ -214,7 +206,25 @@ let CasbinAuthorizationEnforcer = CasbinAuthorizationEnforcer_1 = class CasbinAu
|
|
|
214
206
|
await enforcer.addNamedDomainMatchingFunc(ignis_kernel_3.CasbinRuleVariants.G, casbin.Util.keyMatchFunc);
|
|
215
207
|
await enforcer.addFunction('objectMatch', ignis_kernel_2.AuthorizationPermissionBuilder.objectMatch);
|
|
216
208
|
// A dedicated role manager for the resource axis, NOT addNamedMatchingFunc: a matching func sets casbin's `hasPattern`, which makes every hasLink rebuild the whole g4 graph.
|
|
217
|
-
enforcer.setNamedRoleManager(ignis_kernel_3.AuthorizationPolicyVariants.RESOURCE_INHERITS.rule, new
|
|
209
|
+
enforcer.setNamedRoleManager(ignis_kernel_3.AuthorizationPolicyVariants.RESOURCE_INHERITS.rule, new resource_1.ResourceRoleManager());
|
|
210
|
+
// Shared across g2, g3, and the reversed `g` instance below: casbin never puts the
|
|
211
|
+
// `g`-axis hierarchy manager in rmMap, so it never receives addLink and would miss
|
|
212
|
+
// per-request g3 edges - g2 needs the same freshness for a just-created child domain.
|
|
213
|
+
// This is a per-REQUEST overlay: `clear()` empties it every buildRoleLinks cycle, and it is
|
|
214
|
+
// repopulated from whatever `g3` lines this principal's own policy line set carries.
|
|
215
|
+
const domainHierarchyOverlay = new Map();
|
|
216
|
+
// g2 (membership) and g3 (domain nesting, request-domain-first) sit on their own axes.
|
|
217
|
+
enforcer.setNamedRoleManager(ignis_kernel_3.CasbinRuleVariants.G2, new membership_1.MembershipRoleManager({ overlay: domainHierarchyOverlay }));
|
|
218
|
+
enforcer.setNamedRoleManager(ignis_kernel_3.CasbinRuleVariants.G3, new domain_hierarchy_1.DomainHierarchyRoleManager({ overlay: domainHierarchyOverlay }));
|
|
219
|
+
// addNamedDomainMatchingFunc(G, keyMatchFunc) above must stay: generateTempRoles ORs
|
|
220
|
+
// hasDomainPattern with hasDomainHierarchy, and role_inherits `*` rides the keyMatch path.
|
|
221
|
+
const gRoleManager = enforcer.getNamedRoleManager(ignis_kernel_3.CasbinRuleVariants.G);
|
|
222
|
+
if (!gRoleManager?.addDomainHierarchy) {
|
|
223
|
+
throw (0, core_1.getError)({
|
|
224
|
+
message: '[registerMatchers] The "g" role manager does not expose addDomainHierarchy() - the scoped model requires casbin\'s DefaultRoleManager on the g axis (present in casbin ^5.51.1, this package\'s pinned range). Upgrade casbin, or check that a custom role manager was not substituted for "g".',
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
await gRoleManager.addDomainHierarchy(new domain_hierarchy_1.DomainHierarchyRoleManager({ reversed: true, overlay: domainHierarchyOverlay }));
|
|
218
228
|
}
|
|
219
229
|
await enforcer.buildRoleLinks();
|
|
220
230
|
}
|
|
@@ -284,108 +294,29 @@ let CasbinAuthorizationEnforcer = CasbinAuthorizationEnforcer_1 = class CasbinAu
|
|
|
284
294
|
});
|
|
285
295
|
}
|
|
286
296
|
// Policy loading internals
|
|
287
|
-
/**
|
|
288
|
-
async fetchLinesWithRedisCache(opts) {
|
|
289
|
-
const { user, cached } = opts;
|
|
290
|
-
const cacheKey = await this.resolveCacheKey({ user, cached });
|
|
291
|
-
// Cache hit - Redis owns expiry (PX on write), so a present key is fresh; a corrupted/legacy entry must NOT 500 the request, so it is discarded and refetched.
|
|
292
|
-
const raw = await cached.options.connection.get({ key: cacheKey });
|
|
293
|
-
if (raw) {
|
|
294
|
-
const lines = this.parseCachedPolicyLines({ raw, cacheKey });
|
|
295
|
-
if (lines) {
|
|
296
|
-
return lines;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
const existing = this.pendingLineFetches.get(cacheKey);
|
|
300
|
-
if (existing) {
|
|
301
|
-
return existing;
|
|
302
|
-
}
|
|
303
|
-
// Cache miss (or discarded corrupt entry) - extract from an ISOLATED enforcer so a concurrent load cannot contaminate the cache, persist it, then return the lines for THIS request.
|
|
304
|
-
const task = async () => {
|
|
305
|
-
const lines = await this.extractUserLines({ user });
|
|
306
|
-
await this.writeCachedPolicyLines({ cacheKey, lines, options: cached.options });
|
|
307
|
-
return lines;
|
|
308
|
-
};
|
|
309
|
-
const promise = task().finally(() => {
|
|
310
|
-
this.pendingLineFetches.delete(cacheKey);
|
|
311
|
-
});
|
|
312
|
-
this.pendingLineFetches.set(cacheKey, promise);
|
|
313
|
-
return promise;
|
|
314
|
-
}
|
|
315
|
-
/** Single source of truth for the Redis cache encoding. Used by miss-path and rebuild. */
|
|
316
|
-
async writeCachedPolicyLines(opts) {
|
|
317
|
-
await opts.options.connection.set({
|
|
318
|
-
key: opts.cacheKey,
|
|
319
|
-
value: opts.lines,
|
|
320
|
-
options: { expiresIn: opts.options.expiresIn },
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
/** Decode cached policy lines; on any corruption, log and return null so the caller refetches. */
|
|
324
|
-
parseCachedPolicyLines(opts) {
|
|
325
|
-
try {
|
|
326
|
-
const parsed = JSON.parse(opts.raw);
|
|
327
|
-
if (!Array.isArray(parsed) || parsed.some(line => typeof line !== 'string')) {
|
|
328
|
-
throw (0, core_1.getError)({
|
|
329
|
-
message: '[CasbinAuthorizationEnforcer] Cached payload is not an array of policy lines.',
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
return parsed;
|
|
333
|
-
}
|
|
334
|
-
catch (error) {
|
|
335
|
-
this.logger
|
|
336
|
-
.for(this.parseCachedPolicyLines.name)
|
|
337
|
-
.warn('Discarding corrupted authz cache entry | key: %s | error: %s', opts.cacheKey, error);
|
|
338
|
-
return null;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
/** Extract a user's lines from an ISOLATED throwaway enforcer (own model + adapter), never a pooled serving one, so concurrent requests cannot change what we cache. */
|
|
297
|
+
/** Resolves this enforcer's model, then delegates the isolated-enforcer extraction (own model + adapter, never a pooled serving one, so concurrent requests cannot change what we cache) to PolicyLineCodec. */
|
|
342
298
|
async extractUserLines(opts) {
|
|
343
299
|
const casbin = await import('casbin');
|
|
344
300
|
const model = this.resolveModel({ casbin, model: this.options.model });
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
}
|
|
351
|
-
await loader.loadFilteredPolicy({
|
|
352
|
-
principal: { type: opts.user.principalType, id: opts.user.userId },
|
|
301
|
+
return policy_line_codec_1.PolicyLineCodec.extractUserLines({
|
|
302
|
+
casbin,
|
|
303
|
+
model,
|
|
304
|
+
adapter: this.options.adapter,
|
|
305
|
+
user: opts.user,
|
|
353
306
|
});
|
|
354
|
-
return this.extractLinesFrom(loader);
|
|
355
|
-
}
|
|
356
|
-
/** Serialize ALL p-types and g-types (not just `p`/`g`) back into casbin lines so the cached payload is complete for the scoped model; it reads stored rules, so the loader needs no matching funcs registered. */
|
|
357
|
-
async extractLinesFrom(enforcer) {
|
|
358
|
-
const model = enforcer.getModel();
|
|
359
|
-
const lines = [];
|
|
360
|
-
const policyTypes = model.model.get(ignis_kernel_3.CasbinRuleVariants.P);
|
|
361
|
-
for (const ptype of policyTypes?.keys() ?? []) {
|
|
362
|
-
const rules = await enforcer.getNamedPolicy(ptype);
|
|
363
|
-
for (const rule of rules) {
|
|
364
|
-
lines.push([ptype, ...rule].join(', '));
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
const groupingTypes = model.model.get(ignis_kernel_3.CasbinRuleVariants.G);
|
|
368
|
-
for (const gtype of groupingTypes?.keys() ?? []) {
|
|
369
|
-
const rules = await enforcer.getNamedGroupingPolicy(gtype);
|
|
370
|
-
for (const rule of rules) {
|
|
371
|
-
lines.push([gtype, ...rule].join(', '));
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
return lines;
|
|
375
307
|
}
|
|
376
|
-
/**
|
|
308
|
+
/** Requires configure() to have resolved the casbin Helper; the clearPolicy + loadPolicyLine + buildRoleLinks ordering lives in PolicyLineCodec. */
|
|
377
309
|
async loadPolicyLinesIntoModel(opts) {
|
|
378
310
|
if (!this.helper) {
|
|
379
311
|
throw (0, core_1.getError)({
|
|
380
312
|
message: '[loadPolicyLinesIntoModel] Not configured. Call configure() first.',
|
|
381
313
|
});
|
|
382
314
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
this.helper
|
|
387
|
-
}
|
|
388
|
-
await opts.enforcer.buildRoleLinks();
|
|
315
|
+
await policy_line_codec_1.PolicyLineCodec.loadLinesIntoModel({
|
|
316
|
+
enforcer: opts.enforcer,
|
|
317
|
+
lines: opts.lines,
|
|
318
|
+
helper: this.helper,
|
|
319
|
+
});
|
|
389
320
|
}
|
|
390
321
|
};
|
|
391
322
|
exports.CasbinAuthorizationEnforcer = CasbinAuthorizationEnforcer;
|