@dudousxd/nestjs-authz-typeorm 0.6.0 → 1.1.0
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/CHANGELOG.md +18 -0
- package/README.md +26 -0
- package/dist/authz-rbac.module.d.ts +12 -0
- package/dist/authz-rbac.module.d.ts.map +1 -1
- package/dist/authz-rbac.module.js +23 -44
- package/dist/authz-rbac.module.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tenancy.d.ts +100 -0
- package/dist/tenancy.d.ts.map +1 -0
- package/dist/tenancy.js +128 -0
- package/dist/tenancy.js.map +1 -0
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @dudousxd/nestjs-authz-typeorm
|
|
2
2
|
|
|
3
|
+
## 1.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#72](https://github.com/DavideCarvalho/nestjs-authz/pull/72) [`58a5d72`](https://github.com/DavideCarvalho/nestjs-authz/commit/58a5d72d2964a7cfae9cbfe8506526c8518ba30a) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Tenancy for the RBAC modules, following the `@dudousxd/nestjs-context` tenancy switch.
|
|
8
|
+
|
|
9
|
+
- New `tenancy` option (`'inherit' | false | { enabled?, kinds?, nullRows?, roles? }`, default `'inherit'`). With context tenancy on, permission and role checks are scoped to the request's tenant from `Context.setTenant`. A request with no tenant, inside `Context.allTenants()`, or outside a request sees global assignments only. `kinds` limits the tenant kinds this module honours. With tenancy off nothing changes.
|
|
10
|
+
- `tenancy.roles` maps the caller's role inside the tenant (`tenant.role`) to authz roles that apply in that tenant only, e.g. `{ owner: 'org_admin' }`.
|
|
11
|
+
- New `tenant` resolver option, `(user) => tenantId | null | undefined`: an explicit tenant that wins over the context.
|
|
12
|
+
- MikroORM and Prisma can now store tenant-scoped role assignments like Drizzle and TypeORM: `assignRole`, `removeRole` and `setUserRoles` take `{ tenantId }`, and the read methods take a tenant scope. MikroORM: build the entities with `createAuthzEntitySchemas({}, { tenantScoped: true })`. Prisma: add `tenantId String @default("")` to `UserRole` and its `@@id`, then pass `tenantScoped: true`. Without that, every assignment stays global.
|
|
13
|
+
|
|
14
|
+
## 1.0.0
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- Updated dependencies [[`750a6b3`](https://github.com/DavideCarvalho/nestjs-authz/commit/750a6b3f80deea3803dec8df5f9f8cf67a046ac1)]:
|
|
19
|
+
- @dudousxd/nestjs-authz@0.10.0
|
|
20
|
+
|
|
3
21
|
## 0.6.0
|
|
4
22
|
|
|
5
23
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -79,6 +79,32 @@ The user is the one the official guard reads (`AuthorizationModule.forRoot({ get
|
|
|
79
79
|
default `request.user`), mapped to a store ref with `userRefFrom` (default `{ type, id }` or
|
|
80
80
|
`{ id }`).
|
|
81
81
|
|
|
82
|
+
## Tenancy
|
|
83
|
+
|
|
84
|
+
With `@dudousxd/nestjs-context` installed, the module reads the current tenant from the context
|
|
85
|
+
accessor (`Context.tenantId()`). A tenant-scoped role then grants only inside its own tenant.
|
|
86
|
+
Global roles and direct grants apply everywhere.
|
|
87
|
+
|
|
88
|
+
With tenancy on (`ContextModule.forRoot({ tenancy: { enabled: true } })` in
|
|
89
|
+
`@dudousxd/nestjs-context`), checks are scoped to the request's tenant from `Context.setTenant(...)`.
|
|
90
|
+
A request with no tenant, or inside `Context.allTenants()`, sees global assignments only.
|
|
91
|
+
|
|
92
|
+
```ts
|
|
93
|
+
AuthzRbacModule.forRoot({
|
|
94
|
+
connectionName: 'default',
|
|
95
|
+
tenancy: {
|
|
96
|
+
kinds: ['organization'], // optional: tenant kinds this module honours
|
|
97
|
+
roles: { owner: 'org_admin', member: 'org_member' }, // optional: tenant.role → authz roles in that tenant
|
|
98
|
+
},
|
|
99
|
+
tenant: (user) => (user as { orgId?: string }).orgId, // optional: an explicit tenant wins over the context
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`tenancy` defaults to `'inherit'` (follow the context switch); `false` keeps this module out.
|
|
104
|
+
Roles mapped with `roles` apply only inside that tenant and only to the context's current user.
|
|
105
|
+
The `tenant` resolver returns a tenant id, `null` for the global scope, or `undefined` to fall
|
|
106
|
+
back to the context.
|
|
107
|
+
|
|
82
108
|
## Query scopes
|
|
83
109
|
|
|
84
110
|
```ts
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { UserRef } from '@dudousxd/nestjs-authz/store-kit';
|
|
2
2
|
import { type DynamicModule } from '@nestjs/common';
|
|
3
|
+
import { type AuthzTenancyOption, type TenantResolver } from './tenancy.js';
|
|
3
4
|
import { TypeOrmAuthzStore } from './typeorm-authz.store.js';
|
|
4
5
|
import type { AuthzStoreOptions } from './types.js';
|
|
5
6
|
/** Injection token holding the {@link TypeOrmAuthzStore} the RBAC module manages. */
|
|
@@ -22,6 +23,17 @@ export interface AuthzRbacModuleBaseOptions {
|
|
|
22
23
|
* {@link defaultUserRefMapper} (`{ type, id }` or `{ id }`).
|
|
23
24
|
*/
|
|
24
25
|
userRefFrom?: UserRefMapper;
|
|
26
|
+
/**
|
|
27
|
+
* Tenancy, from `@dudousxd/nestjs-context`. `'inherit'` (default) follows `ContextModule`'s
|
|
28
|
+
* `tenancy.enabled`; with it on, checks are scoped to the context tenant. The object form adds
|
|
29
|
+
* `kinds` and `roles` (map the caller's `tenant.role` to authz roles in that tenant).
|
|
30
|
+
*/
|
|
31
|
+
tenancy?: AuthzTenancyOption;
|
|
32
|
+
/**
|
|
33
|
+
* Explicit tenant for a check, from the user being checked. Wins over the context: return a
|
|
34
|
+
* tenant id, `null` for the global scope, or `undefined` to fall back to the context.
|
|
35
|
+
*/
|
|
36
|
+
tenant?: TenantResolver;
|
|
25
37
|
}
|
|
26
38
|
/**
|
|
27
39
|
* Where the store comes from: build it yourself (`store`), or name a TypeORM connection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz-rbac.module.d.ts","sourceRoot":"","sources":["../src/authz-rbac.module.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EACL,KAAK,aAAa,EAQnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,qFAAqF;AACrF,eAAO,MAAM,gBAAgB,eAAqD,CAAC;AACnF,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,eAAuD,CAAC;AAEvF;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"authz-rbac.module.d.ts","sourceRoot":"","sources":["../src/authz-rbac.module.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EACL,KAAK,aAAa,EAQnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,kBAAkB,EAGvB,KAAK,cAAc,EAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,qFAAqF;AACrF,eAAO,MAAM,gBAAgB,eAAqD,CAAC;AACnF,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,eAAuD,CAAC;AAEvF;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,0BAA0B,GAC7D,CACI;IACE,sEAAsE;IACtE,KAAK,EAAE,iBAAiB,CAAC;IACzB,cAAc,CAAC,EAAE,KAAK,CAAC;IACvB,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB,GACD;IACE,kGAAkG;IAClG,cAAc,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CACJ,CAAC;AAKJ,MAAM,MAAM,2BAA2B,GACnC;IACE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,sBAAsB,CAAC,GAAG,sBAAsB,CAAC;IAC7F,cAAc,CAAC,EAAE,KAAK,CAAC;IACvB,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB,GACD;IACE,qGAAqG;IACrG,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,CACX,GAAG,IAAI,EAAE,OAAO,EAAE,KACf,OAAO,CAAC,0BAA0B,CAAC,GAAG,0BAA0B,CAAC;CACvE,CAAC;AA6BN,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAOvE;AA4HD;;;;;;;GAOG;AACH,qBACa,eAAe;IAC1B,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,sBAAsB,GAAG,aAAa;IAqB9D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,2BAA2B,GAAG,aAAa;IA0CxE,OAAO,CAAC,MAAM,CAAC,eAAe;CAc/B"}
|
|
@@ -15,6 +15,7 @@ import { createRequire } from 'node:module';
|
|
|
15
15
|
import { CONTEXT_ACCESSOR, PERMISSION_PROVIDER, ROLE_PROVIDER, } from '@dudousxd/nestjs-authz';
|
|
16
16
|
import { Inject, Injectable, Module, Optional, } from '@nestjs/common';
|
|
17
17
|
import { ModuleRef } from '@nestjs/core';
|
|
18
|
+
import { rbacTenant, } from './tenancy.js';
|
|
18
19
|
import { TypeOrmAuthzStore } from './typeorm-authz.store.js';
|
|
19
20
|
/** Injection token holding the {@link TypeOrmAuthzStore} the RBAC module manages. */
|
|
20
21
|
export const AUTHZ_RBAC_STORE = Symbol.for('@dudousxd/nestjs-authz-typeorm:store');
|
|
@@ -42,42 +43,6 @@ function connectionToken(name) {
|
|
|
42
43
|
}
|
|
43
44
|
return official.getDataSourceToken(name);
|
|
44
45
|
}
|
|
45
|
-
/** Read the current tenant from the (optional) context accessor, defensively. */
|
|
46
|
-
function tenantScopeFrom(context) {
|
|
47
|
-
if (!context || typeof context.tenantId !== 'function')
|
|
48
|
-
return {};
|
|
49
|
-
let tenantId;
|
|
50
|
-
try {
|
|
51
|
-
tenantId = context.tenantId();
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
tenantId = undefined;
|
|
55
|
-
}
|
|
56
|
-
return tenantId == null ? {} : { tenantId };
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Locate the context accessor for tenant scoping. Prefers a value injected into
|
|
60
|
-
* this module; falls back to a non-strict {@link ModuleRef} lookup so an accessor
|
|
61
|
-
* provided by ANY module (the app root, a global ContextModule) is still found —
|
|
62
|
-
* the RBAC module is global and its providers don't import the app's modules, so a
|
|
63
|
-
* plain `@Inject` would miss a root-provided accessor. Mirrors the Gate's seam.
|
|
64
|
-
*/
|
|
65
|
-
function resolveTenantContext(injected, moduleRef, cache) {
|
|
66
|
-
if (injected)
|
|
67
|
-
return injected;
|
|
68
|
-
if (cache.resolved)
|
|
69
|
-
return cache.value;
|
|
70
|
-
cache.resolved = true;
|
|
71
|
-
if (moduleRef) {
|
|
72
|
-
try {
|
|
73
|
-
cache.value = moduleRef.get(CONTEXT_ACCESSOR, { strict: false });
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
cache.value = undefined;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return cache.value;
|
|
80
|
-
}
|
|
81
46
|
/** Default mapping: accept a `{ type, id }` ref, a `{ id }` object, or a bare id. */
|
|
82
47
|
export function defaultUserRefMapper(user) {
|
|
83
48
|
if (user == null)
|
|
@@ -110,8 +75,14 @@ let RbacPermissionProvider = class RbacPermissionProvider {
|
|
|
110
75
|
this.context = context;
|
|
111
76
|
this.moduleRef = moduleRef;
|
|
112
77
|
}
|
|
113
|
-
|
|
114
|
-
return
|
|
78
|
+
tenant(user, ref) {
|
|
79
|
+
return rbacTenant(this.options, user, ref, this.context, this.moduleRef, this.contextCache, true);
|
|
80
|
+
}
|
|
81
|
+
/** The permissions `tenancy.roles` grants through the caller's role in the tenant. */
|
|
82
|
+
async tenantRolePermissions(roles) {
|
|
83
|
+
if (roles.length === 0)
|
|
84
|
+
return [];
|
|
85
|
+
return Object.values(await this.options.store.getRolePermissions(roles)).flat();
|
|
115
86
|
}
|
|
116
87
|
// The core `PermissionProvider` interface passes an optional `resource` (3rd
|
|
117
88
|
// arg); it is intentionally ignored here. RBAC grants are model-less,
|
|
@@ -124,7 +95,10 @@ let RbacPermissionProvider = class RbacPermissionProvider {
|
|
|
124
95
|
const ref = map(user);
|
|
125
96
|
if (ref === undefined)
|
|
126
97
|
return undefined;
|
|
127
|
-
|
|
98
|
+
const tenant = this.tenant(user, ref);
|
|
99
|
+
if (await this.options.store.userHasPermission(ref, permission, tenant.scope))
|
|
100
|
+
return true;
|
|
101
|
+
return (await this.tenantRolePermissions(tenant.roles)).includes(permission);
|
|
128
102
|
}
|
|
129
103
|
// Expose the user's full granted permission set so the core can apply
|
|
130
104
|
// Laravel/spatie-style wildcard matching (a granted `posts.*` satisfies a check
|
|
@@ -135,7 +109,11 @@ let RbacPermissionProvider = class RbacPermissionProvider {
|
|
|
135
109
|
const ref = map(user);
|
|
136
110
|
if (ref === undefined)
|
|
137
111
|
return undefined;
|
|
138
|
-
|
|
112
|
+
const tenant = this.tenant(user, ref);
|
|
113
|
+
const own = await this.options.store.getPermissionsForUser(ref, tenant.scope);
|
|
114
|
+
if (tenant.roles.length === 0)
|
|
115
|
+
return own;
|
|
116
|
+
return [...new Set([...own, ...(await this.tenantRolePermissions(tenant.roles))])];
|
|
139
117
|
}
|
|
140
118
|
};
|
|
141
119
|
RbacPermissionProvider = __decorate([
|
|
@@ -170,10 +148,11 @@ let RbacRoleProvider = class RbacRoleProvider {
|
|
|
170
148
|
const ref = map(user);
|
|
171
149
|
if (ref === undefined)
|
|
172
150
|
return undefined;
|
|
173
|
-
// Scope roles by the current tenant
|
|
174
|
-
// tenant
|
|
175
|
-
const
|
|
176
|
-
|
|
151
|
+
// Scope roles by the current tenant: a tenant-scoped role only counts within its
|
|
152
|
+
// tenant; global roles always count. `tenancy.roles` adds the caller's tenant roles.
|
|
153
|
+
const tenant = rbacTenant(this.options, user, ref, this.context, this.moduleRef, this.contextCache, true);
|
|
154
|
+
const own = await this.options.store.getRolesForUser(ref, tenant.scope);
|
|
155
|
+
return tenant.roles.length === 0 ? own : [...new Set([...own, ...tenant.roles])];
|
|
177
156
|
}
|
|
178
157
|
};
|
|
179
158
|
RbacRoleProvider = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz-rbac.module.js","sourceRoot":"","sources":["../src/authz-rbac.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EAEnB,aAAa,GAEd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,MAAM,EACN,UAAU,EACV,MAAM,EAEN,QAAQ,GAGT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,qFAAqF;AACrF,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AACnF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"authz-rbac.module.js","sourceRoot":"","sources":["../src/authz-rbac.module.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type { RoleAssignment, RoleAssignmentFilter, UserAuthz, UserRoleAssignmen
|
|
|
5
5
|
export { AUTHZ_RBAC_OPTIONS, AUTHZ_RBAC_STORE, AuthzRbacModule, defaultUserRefMapper, } from './authz-rbac.module.js';
|
|
6
6
|
export type { AuthzRbacModuleAsyncOptions, AuthzRbacModuleBaseOptions, AuthzRbacModuleOptions, UserRefMapper, } from './authz-rbac.module.js';
|
|
7
7
|
export type { AuthzStoreOptions, RoleAssignmentScope, TableNames, TenantScope } from './types.js';
|
|
8
|
+
export type { AuthzTenancyOption, TenantResolver } from './tenancy.js';
|
|
8
9
|
export type { UserRef, UserRefInput } from '@dudousxd/nestjs-authz/store-kit';
|
|
9
10
|
export { applyScope, applyScopeConstraint, compileScope } from './scope.js';
|
|
10
11
|
export type { CompiledScope, ScopeResolver } from './scope.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,SAAS,EACT,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,2BAA2B,EAC3B,0BAA0B,EAC1B,sBAAsB,EACtB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAClG,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,SAAS,EACT,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,2BAA2B,EAC3B,0BAA0B,EAC1B,sBAAsB,EACtB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAClG,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAO7D,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAO7D,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAUhC,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { type UserRef } from '@dudousxd/nestjs-authz/store-kit';
|
|
2
|
+
import type { ModuleRef } from '@nestjs/core';
|
|
3
|
+
/** A tenant as published by `@dudousxd/nestjs-context` (`Context.tenant()`). */
|
|
4
|
+
export interface TenantRef {
|
|
5
|
+
id: string;
|
|
6
|
+
kind: string;
|
|
7
|
+
source: string;
|
|
8
|
+
slug?: string;
|
|
9
|
+
role?: string;
|
|
10
|
+
}
|
|
11
|
+
/** How the context says a lib must scope data right now (`Context.tenantFilter()`). */
|
|
12
|
+
export type TenantFilter = {
|
|
13
|
+
mode: 'system';
|
|
14
|
+
} | {
|
|
15
|
+
mode: 'all';
|
|
16
|
+
} | {
|
|
17
|
+
mode: 'tenantless';
|
|
18
|
+
} | {
|
|
19
|
+
mode: 'tenant';
|
|
20
|
+
tenant: TenantRef;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The RBAC module's `tenancy` option. `'inherit'` (default) follows `ContextModule`'s
|
|
24
|
+
* `tenancy.enabled`; `false` keeps this module out of tenancy.
|
|
25
|
+
*/
|
|
26
|
+
export type AuthzTenancyOption = 'inherit' | false | {
|
|
27
|
+
/** `'inherit'` (default) follows the context switch; a boolean overrides it. */
|
|
28
|
+
enabled?: 'inherit' | boolean;
|
|
29
|
+
/** Tenant kinds this module honours, instead of the context's `kinds`. */
|
|
30
|
+
kinds?: string[];
|
|
31
|
+
/**
|
|
32
|
+
* Accepted for the shared shape. It changes nothing here: a GLOBAL role assignment
|
|
33
|
+
* always applies, in every tenant.
|
|
34
|
+
*/
|
|
35
|
+
nullRows?: 'tenantless' | 'shared';
|
|
36
|
+
/**
|
|
37
|
+
* Map the caller's role inside the context tenant (`tenant.role`) to authz roles that
|
|
38
|
+
* apply in that tenant's scope only, e.g. `{ owner: 'org_admin', member: 'org_member' }`.
|
|
39
|
+
* Unmapped roles grant nothing.
|
|
40
|
+
*/
|
|
41
|
+
roles?: Record<string, string | readonly string[]>;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* An explicit tenant for a check, from the user being checked. Return a tenant id to scope the
|
|
45
|
+
* check to it, `null` for the global scope, or `undefined` to fall back to the context.
|
|
46
|
+
*/
|
|
47
|
+
export type TenantResolver = (user: unknown) => string | null | undefined;
|
|
48
|
+
/** The structural slice of nestjs-context's accessor this module reads. */
|
|
49
|
+
export interface TenantContextAccessor {
|
|
50
|
+
tenantId?(): string | undefined;
|
|
51
|
+
userRef?(): {
|
|
52
|
+
type?: string;
|
|
53
|
+
id: string | number;
|
|
54
|
+
} | undefined;
|
|
55
|
+
tenancy?(): {
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
kinds?: string[];
|
|
58
|
+
};
|
|
59
|
+
tenantFilter?(options?: {
|
|
60
|
+
kinds?: string[];
|
|
61
|
+
}): TenantFilter;
|
|
62
|
+
}
|
|
63
|
+
/** The tenant scope of one check, plus the roles `tenancy.roles` adds in that scope. */
|
|
64
|
+
export interface RbacTenant {
|
|
65
|
+
scope: {
|
|
66
|
+
tenantId?: string;
|
|
67
|
+
};
|
|
68
|
+
roles: string[];
|
|
69
|
+
}
|
|
70
|
+
export interface ResolveRbacTenantInput {
|
|
71
|
+
/** The user as the Gate passed it. */
|
|
72
|
+
user: unknown;
|
|
73
|
+
/** The same user mapped to a store ref. */
|
|
74
|
+
ref: UserRef;
|
|
75
|
+
/** The module's explicit `tenant` resolver, if any. */
|
|
76
|
+
resolver?: TenantResolver | undefined;
|
|
77
|
+
/** The module's `tenancy` option. */
|
|
78
|
+
tenancy?: AuthzTenancyOption | undefined;
|
|
79
|
+
/** The context accessor found through DI, if any (else the global slot is read). */
|
|
80
|
+
accessor?: TenantContextAccessor | undefined;
|
|
81
|
+
/** With tenancy off, scope by the context's plain `tenantId()` (drizzle/typeorm behaviour). */
|
|
82
|
+
legacyContextTenant: boolean;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Precedence: the explicit `tenant` resolver, then (tenancy on) the context tenant filter, then
|
|
86
|
+
* (tenancy off) the adapter's behaviour without tenancy. `tenant` mode scopes to that tenant;
|
|
87
|
+
* `tenantless`, `all` and `system` use the global scope.
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveRbacTenant(input: ResolveRbacTenantInput): RbacTenant;
|
|
90
|
+
/** A provider's per-instance cache for {@link rbacTenant}'s accessor lookup. */
|
|
91
|
+
export interface TenantContextCache {
|
|
92
|
+
resolved: boolean;
|
|
93
|
+
value: TenantContextAccessor | undefined;
|
|
94
|
+
}
|
|
95
|
+
/** The tenant scope (and `tenancy.roles` roles) of one check for `user`. */
|
|
96
|
+
export declare function rbacTenant(options: {
|
|
97
|
+
tenant?: TenantResolver | undefined;
|
|
98
|
+
tenancy?: AuthzTenancyOption | undefined;
|
|
99
|
+
}, user: unknown, ref: UserRef, injected: TenantContextAccessor | undefined, moduleRef: ModuleRef | undefined, cache: TenantContextCache, legacyContextTenant: boolean): RbacTenant;
|
|
100
|
+
//# sourceMappingURL=tenancy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancy.d.ts","sourceRoot":"","sources":["../src/tenancy.ts"],"names":[],"mappings":"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"}
|
package/dist/tenancy.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// Tenancy for the RBAC module: which tenant scope a permission/role check runs in, and which
|
|
2
|
+
// roles the caller's role inside the context tenant maps to. The same file ships in every
|
|
3
|
+
// store adapter. It reads the @dudousxd/nestjs-context tenancy contract STRUCTURALLY (no import),
|
|
4
|
+
// so it works with any context version, and with none: a missing or older context reads as
|
|
5
|
+
// tenancy off.
|
|
6
|
+
import { CONTEXT_ACCESSOR } from '@dudousxd/nestjs-authz';
|
|
7
|
+
import { normalizeUserRef } from '@dudousxd/nestjs-authz/store-kit';
|
|
8
|
+
const SLOT = Symbol.for('@dudousxd/nestjs-diagnostics:accessor');
|
|
9
|
+
/** Is tenancy on for this module? Call per check: the context can change between requests. */
|
|
10
|
+
function readTenancy(option, a) {
|
|
11
|
+
if (option === false)
|
|
12
|
+
return { enabled: false };
|
|
13
|
+
if (typeof a?.tenancy !== 'function' || typeof a.tenantFilter !== 'function') {
|
|
14
|
+
return { enabled: false };
|
|
15
|
+
}
|
|
16
|
+
const own = typeof option === 'object' ? option : {};
|
|
17
|
+
const inherit = own.enabled === undefined || own.enabled === 'inherit';
|
|
18
|
+
if (!(inherit ? a.tenancy().enabled : own.enabled))
|
|
19
|
+
return { enabled: false };
|
|
20
|
+
const kinds = own.kinds;
|
|
21
|
+
const tenantFilter = a.tenantFilter.bind(a);
|
|
22
|
+
return { enabled: true, filter: () => tenantFilter(kinds ? { kinds } : undefined) };
|
|
23
|
+
}
|
|
24
|
+
/** The accessor found through DI, else the global slot `ContextModule` publishes. */
|
|
25
|
+
function effectiveAccessor(injected) {
|
|
26
|
+
if (injected)
|
|
27
|
+
return injected;
|
|
28
|
+
const slot = globalThis[SLOT];
|
|
29
|
+
const current = slot?.current;
|
|
30
|
+
return current && typeof current === 'object' ? current : undefined;
|
|
31
|
+
}
|
|
32
|
+
/** Today's behaviour without tenancy: the context's plain `tenantId()`, read defensively. */
|
|
33
|
+
function legacyTenantId(accessor) {
|
|
34
|
+
if (!accessor || typeof accessor.tenantId !== 'function')
|
|
35
|
+
return undefined;
|
|
36
|
+
try {
|
|
37
|
+
return accessor.tenantId() ?? undefined;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Is `ref` the context's current user? Tenant roles belong to the caller, nobody else. */
|
|
44
|
+
function isContextUser(ref, accessor) {
|
|
45
|
+
let current;
|
|
46
|
+
try {
|
|
47
|
+
current = accessor?.userRef?.();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
current = undefined;
|
|
51
|
+
}
|
|
52
|
+
if (!current || current.id === undefined || current.id === null)
|
|
53
|
+
return false;
|
|
54
|
+
const a = normalizeUserRef(ref);
|
|
55
|
+
const b = normalizeUserRef(current);
|
|
56
|
+
return a.type === b.type && a.id === b.id;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Precedence: the explicit `tenant` resolver, then (tenancy on) the context tenant filter, then
|
|
60
|
+
* (tenancy off) the adapter's behaviour without tenancy. `tenant` mode scopes to that tenant;
|
|
61
|
+
* `tenantless`, `all` and `system` use the global scope.
|
|
62
|
+
*/
|
|
63
|
+
export function resolveRbacTenant(input) {
|
|
64
|
+
const explicit = input.resolver ? input.resolver(input.user) : undefined;
|
|
65
|
+
const accessor = effectiveAccessor(input.accessor);
|
|
66
|
+
const tenancy = readTenancy(input.tenancy, accessor);
|
|
67
|
+
const filter = tenancy.enabled ? tenancy.filter() : undefined;
|
|
68
|
+
let scope;
|
|
69
|
+
if (explicit !== undefined) {
|
|
70
|
+
scope = explicit === null ? {} : { tenantId: explicit };
|
|
71
|
+
}
|
|
72
|
+
else if (filter) {
|
|
73
|
+
scope = filter.mode === 'tenant' ? { tenantId: filter.tenant.id } : {};
|
|
74
|
+
}
|
|
75
|
+
else if (input.legacyContextTenant) {
|
|
76
|
+
const id = legacyTenantId(input.accessor);
|
|
77
|
+
scope = id === undefined ? {} : { tenantId: id };
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
scope = {};
|
|
81
|
+
}
|
|
82
|
+
const map = typeof input.tenancy === 'object' ? input.tenancy.roles : undefined;
|
|
83
|
+
let roles = [];
|
|
84
|
+
if (map &&
|
|
85
|
+
filter?.mode === 'tenant' &&
|
|
86
|
+
filter.tenant.role !== undefined &&
|
|
87
|
+
scope.tenantId === filter.tenant.id &&
|
|
88
|
+
Object.prototype.hasOwnProperty.call(map, filter.tenant.role) &&
|
|
89
|
+
isContextUser(input.ref, accessor)) {
|
|
90
|
+
const mapped = map[filter.tenant.role];
|
|
91
|
+
roles = typeof mapped === 'string' ? [mapped] : [...(mapped ?? [])];
|
|
92
|
+
}
|
|
93
|
+
return { scope, roles };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Locate the context accessor. Prefers a value injected into the module; falls back to a
|
|
97
|
+
* non-strict {@link ModuleRef} lookup so an accessor provided by ANY module (the app root, a
|
|
98
|
+
* global ContextModule) is still found: the RBAC module is global and its providers don't import
|
|
99
|
+
* the app's modules, so a plain `@Inject` would miss a root-provided accessor.
|
|
100
|
+
*/
|
|
101
|
+
function resolveTenantContext(injected, moduleRef, cache) {
|
|
102
|
+
if (injected)
|
|
103
|
+
return injected;
|
|
104
|
+
if (cache.resolved)
|
|
105
|
+
return cache.value;
|
|
106
|
+
cache.resolved = true;
|
|
107
|
+
if (moduleRef) {
|
|
108
|
+
try {
|
|
109
|
+
cache.value = moduleRef.get(CONTEXT_ACCESSOR, { strict: false });
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
cache.value = undefined;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return cache.value;
|
|
116
|
+
}
|
|
117
|
+
/** The tenant scope (and `tenancy.roles` roles) of one check for `user`. */
|
|
118
|
+
export function rbacTenant(options, user, ref, injected, moduleRef, cache, legacyContextTenant) {
|
|
119
|
+
return resolveRbacTenant({
|
|
120
|
+
user,
|
|
121
|
+
ref,
|
|
122
|
+
resolver: options.tenant,
|
|
123
|
+
tenancy: options.tenancy,
|
|
124
|
+
accessor: resolveTenantContext(injected, moduleRef, cache),
|
|
125
|
+
legacyContextTenant,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=tenancy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancy.js","sourceRoot":"","sources":["../src/tenancy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dudousxd/nestjs-authz-typeorm",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "TypeORM RBAC persistence for @dudousxd/nestjs-authz — roles, permissions, and a Gate seam (zero connection ownership).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"CHANGELOG.md"
|
|
39
39
|
],
|
|
40
40
|
"peerDependencies": {
|
|
41
|
-
"@dudousxd/nestjs-authz": ">=0.
|
|
41
|
+
"@dudousxd/nestjs-authz": ">=0.10.0",
|
|
42
42
|
"@nestjs/authorization": "^0.1.3",
|
|
43
43
|
"@nestjs/common": "^12.0.0",
|
|
44
44
|
"@nestjs/core": "^12.0.0",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"typeorm": "0.3.31",
|
|
67
67
|
"typescript": "5.9.3",
|
|
68
68
|
"vitest": "3.2.7",
|
|
69
|
-
"@dudousxd/nestjs-authz": "^0.
|
|
69
|
+
"@dudousxd/nestjs-authz": "^0.10.0"
|
|
70
70
|
},
|
|
71
71
|
"engines": {
|
|
72
72
|
"node": ">=22"
|