@dudousxd/nestjs-authz 0.8.1 → 0.9.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.
Files changed (122) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/README.md +279 -0
  3. package/dist/authz.guard.d.ts +48 -0
  4. package/dist/authz.guard.d.ts.map +1 -0
  5. package/dist/authz.guard.js +144 -0
  6. package/dist/authz.guard.js.map +1 -0
  7. package/dist/can-endpoint.controller.d.ts +0 -19
  8. package/dist/can-endpoint.controller.d.ts.map +1 -1
  9. package/dist/can-endpoint.controller.js +18 -9
  10. package/dist/can-endpoint.controller.js.map +1 -1
  11. package/dist/decision-provider.d.ts +25 -16
  12. package/dist/decision-provider.d.ts.map +1 -1
  13. package/dist/decision-provider.js +11 -1
  14. package/dist/decision-provider.js.map +1 -1
  15. package/dist/decisions.d.ts +24 -0
  16. package/dist/decisions.d.ts.map +1 -0
  17. package/dist/decisions.js +87 -0
  18. package/dist/decisions.js.map +1 -0
  19. package/dist/decorator/roles.decorator.d.ts +6 -12
  20. package/dist/decorator/roles.decorator.d.ts.map +1 -1
  21. package/dist/decorator/roles.decorator.js +13 -15
  22. package/dist/decorator/roles.decorator.js.map +1 -1
  23. package/dist/diagnostics.d.ts +15 -5
  24. package/dist/diagnostics.d.ts.map +1 -1
  25. package/dist/diagnostics.js +3 -1
  26. package/dist/diagnostics.js.map +1 -1
  27. package/dist/errors/exceptions.d.ts +0 -8
  28. package/dist/errors/exceptions.d.ts.map +1 -1
  29. package/dist/errors/exceptions.js +0 -14
  30. package/dist/errors/exceptions.js.map +1 -1
  31. package/dist/gate.d.ts +83 -218
  32. package/dist/gate.d.ts.map +1 -1
  33. package/dist/gate.js +209 -611
  34. package/dist/gate.js.map +1 -1
  35. package/dist/helpers.d.ts +46 -0
  36. package/dist/helpers.d.ts.map +1 -0
  37. package/dist/helpers.js +89 -0
  38. package/dist/helpers.js.map +1 -0
  39. package/dist/index.d.ts +28 -21
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +30 -13
  42. package/dist/index.js.map +1 -1
  43. package/dist/links.d.ts +39 -0
  44. package/dist/links.d.ts.map +1 -0
  45. package/dist/links.js +57 -0
  46. package/dist/links.js.map +1 -0
  47. package/dist/module.d.ts +23 -22
  48. package/dist/module.d.ts.map +1 -1
  49. package/dist/module.js +129 -158
  50. package/dist/module.js.map +1 -1
  51. package/dist/official.d.ts +39 -0
  52. package/dist/official.d.ts.map +1 -0
  53. package/dist/official.js +44 -0
  54. package/dist/official.js.map +1 -0
  55. package/dist/policies/authz-policy.d.ts +42 -0
  56. package/dist/policies/authz-policy.d.ts.map +1 -0
  57. package/dist/policies/authz-policy.js +80 -0
  58. package/dist/policies/authz-policy.js.map +1 -0
  59. package/dist/policies/gate.policy.d.ts +18 -0
  60. package/dist/policies/gate.policy.d.ts.map +1 -0
  61. package/dist/policies/gate.policy.js +37 -0
  62. package/dist/policies/gate.policy.js.map +1 -0
  63. package/dist/policies/index.d.ts +5 -0
  64. package/dist/policies/index.d.ts.map +1 -0
  65. package/dist/policies/index.js +5 -0
  66. package/dist/policies/index.js.map +1 -0
  67. package/dist/policies/permission.policy.d.ts +27 -0
  68. package/dist/policies/permission.policy.d.ts.map +1 -0
  69. package/dist/policies/permission.policy.js +61 -0
  70. package/dist/policies/permission.policy.js.map +1 -0
  71. package/dist/policies/role.policy.d.ts +27 -0
  72. package/dist/policies/role.policy.d.ts.map +1 -0
  73. package/dist/policies/role.policy.js +51 -0
  74. package/dist/policies/role.policy.js.map +1 -0
  75. package/dist/policy-index.d.ts +51 -0
  76. package/dist/policy-index.d.ts.map +1 -0
  77. package/dist/policy-index.js +135 -0
  78. package/dist/policy-index.js.map +1 -0
  79. package/dist/rbac.d.ts +92 -0
  80. package/dist/rbac.d.ts.map +1 -0
  81. package/dist/rbac.js +293 -0
  82. package/dist/rbac.js.map +1 -0
  83. package/dist/resource-resolver.d.ts +15 -17
  84. package/dist/resource-resolver.d.ts.map +1 -1
  85. package/dist/resource-resolver.js +8 -8
  86. package/dist/resource-resolver.js.map +1 -1
  87. package/dist/runtime.d.ts +31 -0
  88. package/dist/runtime.d.ts.map +1 -0
  89. package/dist/runtime.js +40 -0
  90. package/dist/runtime.js.map +1 -0
  91. package/dist/tokens.d.ts +4 -8
  92. package/dist/tokens.d.ts.map +1 -1
  93. package/dist/tokens.js +4 -8
  94. package/dist/tokens.js.map +1 -1
  95. package/dist/types.d.ts +52 -171
  96. package/dist/types.d.ts.map +1 -1
  97. package/package.json +19 -10
  98. package/skills/authz-enforcement/SKILL.md +67 -135
  99. package/skills/authz-policies/SKILL.md +43 -117
  100. package/skills/authz-query-scopes/SKILL.md +16 -9
  101. package/skills/authz-rbac-seams/SKILL.md +29 -12
  102. package/skills/authz-setup/SKILL.md +45 -106
  103. package/dist/decorator/can.decorator.d.ts +0 -29
  104. package/dist/decorator/can.decorator.d.ts.map +0 -1
  105. package/dist/decorator/can.decorator.js +0 -23
  106. package/dist/decorator/can.decorator.js.map +0 -1
  107. package/dist/decorator/policy.decorator.d.ts +0 -18
  108. package/dist/decorator/policy.decorator.d.ts.map +0 -1
  109. package/dist/decorator/policy.decorator.js +0 -28
  110. package/dist/decorator/policy.decorator.js.map +0 -1
  111. package/dist/guard/can.guard.d.ts +0 -31
  112. package/dist/guard/can.guard.d.ts.map +0 -1
  113. package/dist/guard/can.guard.js +0 -92
  114. package/dist/guard/can.guard.js.map +0 -1
  115. package/dist/guard/roles.guard.d.ts +0 -21
  116. package/dist/guard/roles.guard.d.ts.map +0 -1
  117. package/dist/guard/roles.guard.js +0 -50
  118. package/dist/guard/roles.guard.js.map +0 -1
  119. package/dist/policy-registry.d.ts +0 -46
  120. package/dist/policy-registry.d.ts.map +0 -1
  121. package/dist/policy-registry.js +0 -101
  122. package/dist/policy-registry.js.map +0 -1
@@ -0,0 +1,37 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Policy } from '@nestjs/authorization';
11
+ import { Gate } from '../gate.js';
12
+ /**
13
+ * The `Gate`'s string abilities as an official policy: ad-hoc gates from
14
+ * `gate.define()`, named permissions, and `ability` + resource checks through the
15
+ * resource's linked policy.
16
+ *
17
+ * ```ts
18
+ * gate.define('access-admin', (user) => user.isStaff);
19
+ *
20
+ * @Can(GatePolicy, 'allows', ability('access-admin'))
21
+ * ```
22
+ */
23
+ let GatePolicy = class GatePolicy {
24
+ gate;
25
+ constructor(gate) {
26
+ this.gate = gate;
27
+ }
28
+ allows(user, ability, resource) {
29
+ return this.gate.forUser(user).allows(ability, resource);
30
+ }
31
+ };
32
+ GatePolicy = __decorate([
33
+ Policy(),
34
+ __metadata("design:paramtypes", [Gate])
35
+ ], GatePolicy);
36
+ export { GatePolicy };
37
+ //# sourceMappingURL=gate.policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.policy.js","sourceRoot":"","sources":["../../src/policies/gate.policy.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC;;;;;;;;;;GAUG;AAEI,IAAM,UAAU,GAAhB,MAAM,UAAU;IACQ;IAA7B,YAA6B,IAAU;QAAV,SAAI,GAAJ,IAAI,CAAM;IAAG,CAAC;IAE3C,MAAM,CAAC,IAAa,EAAE,OAAe,EAAE,QAAiB;QACtD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;CACF,CAAA;AANY,UAAU;IADtB,MAAM,EAAE;qCAE4B,IAAI;GAD5B,UAAU,CAMtB"}
@@ -0,0 +1,5 @@
1
+ export { AuthzPolicy, decisionProviderBefore, superAdminBefore } from './authz-policy.js';
2
+ export { RolePolicy } from './role.policy.js';
3
+ export { PermissionPolicy } from './permission.policy.js';
4
+ export { GatePolicy } from './gate.policy.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/policies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { AuthzPolicy, decisionProviderBefore, superAdminBefore } from './authz-policy.js';
2
+ export { RolePolicy } from './role.policy.js';
3
+ export { PermissionPolicy } from './permission.policy.js';
4
+ export { GatePolicy } from './gate.policy.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { AuthzRbac } from '../rbac.js';
2
+ import { AuthzPolicy } from './authz-policy.js';
3
+ /**
4
+ * Persisted permissions (through roles, tenant-scoped roles, or granted directly) as an
5
+ * official policy. Wildcard grants apply: `posts.*` satisfies `posts.update`.
6
+ *
7
+ * ```ts
8
+ * @Can(PermissionPolicy, 'has', permission('posts.update'))
9
+ * @Can(PermissionPolicy, 'hasAll', permission('posts.update', 'posts.publish'))
10
+ * ```
11
+ *
12
+ * Honors `superAdmin`.
13
+ */
14
+ export declare class PermissionPolicy extends AuthzPolicy {
15
+ private readonly rbac;
16
+ constructor(rbac: AuthzRbac);
17
+ /**
18
+ * Asks only `superAdmin`: the abilities here name permissions, not a resource, so the
19
+ * external decision point is not consulted.
20
+ */
21
+ before(user: unknown, ability: string): Promise<true | undefined>;
22
+ /** The user holds any of `permissions`. */
23
+ has(user: unknown, ...permissions: string[]): Promise<boolean>;
24
+ /** The user holds every one of `permissions`. */
25
+ hasAll(user: unknown, ...permissions: string[]): Promise<boolean>;
26
+ }
27
+ //# sourceMappingURL=permission.policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.policy.d.ts","sourceRoot":"","sources":["../../src/policies/permission.policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;;GAUG;AACH,qBACa,gBAAiB,SAAQ,WAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,SAAS;IAI5C;;;OAGG;IACM,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAI1E,2CAA2C;IACrC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpE,iDAAiD;IAC3C,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAOxE"}
@@ -0,0 +1,61 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Policy } from '@nestjs/authorization';
11
+ import { AuthzRbac } from '../rbac.js';
12
+ import { AuthzPolicy, superAdminBefore } from './authz-policy.js';
13
+ /**
14
+ * Persisted permissions (through roles, tenant-scoped roles, or granted directly) as an
15
+ * official policy. Wildcard grants apply: `posts.*` satisfies `posts.update`.
16
+ *
17
+ * ```ts
18
+ * @Can(PermissionPolicy, 'has', permission('posts.update'))
19
+ * @Can(PermissionPolicy, 'hasAll', permission('posts.update', 'posts.publish'))
20
+ * ```
21
+ *
22
+ * Honors `superAdmin`.
23
+ */
24
+ let PermissionPolicy = class PermissionPolicy extends AuthzPolicy {
25
+ rbac;
26
+ constructor(rbac) {
27
+ super();
28
+ this.rbac = rbac;
29
+ }
30
+ /**
31
+ * Asks only `superAdmin`: the abilities here name permissions, not a resource, so the
32
+ * external decision point is not consulted.
33
+ */
34
+ before(user, ability) {
35
+ return superAdminBefore(user, ability);
36
+ }
37
+ /** The user holds any of `permissions`. */
38
+ async has(user, ...permissions) {
39
+ for (const permission of permissions) {
40
+ if (await this.rbac.grants(user, permission))
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+ /** The user holds every one of `permissions`. */
46
+ async hasAll(user, ...permissions) {
47
+ if (permissions.length === 0)
48
+ return false;
49
+ for (const permission of permissions) {
50
+ if (!(await this.rbac.grants(user, permission)))
51
+ return false;
52
+ }
53
+ return true;
54
+ }
55
+ };
56
+ PermissionPolicy = __decorate([
57
+ Policy(),
58
+ __metadata("design:paramtypes", [AuthzRbac])
59
+ ], PermissionPolicy);
60
+ export { PermissionPolicy };
61
+ //# sourceMappingURL=permission.policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.policy.js","sourceRoot":"","sources":["../../src/policies/permission.policy.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;;GAUG;AAEI,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,WAAW;IAClB;IAA7B,YAA6B,IAAe;QAC1C,KAAK,EAAE,CAAC;QADmB,SAAI,GAAJ,IAAI,CAAW;IAE5C,CAAC;IAED;;;OAGG;IACM,MAAM,CAAC,IAAa,EAAE,OAAe;QAC5C,OAAO,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,GAAG,CAAC,IAAa,EAAE,GAAG,WAAqB;QAC/C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC5D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,MAAM,CAAC,IAAa,EAAE,GAAG,WAAqB;QAClD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA7BY,gBAAgB;IAD5B,MAAM,EAAE;qCAE4B,SAAS;GADjC,gBAAgB,CA6B5B"}
@@ -0,0 +1,27 @@
1
+ import { AuthzRbac } from '../rbac.js';
2
+ import { AuthzPolicy } from './authz-policy.js';
3
+ /**
4
+ * Persisted (and user-object) roles as an official policy.
5
+ *
6
+ * ```ts
7
+ * @Can(RolePolicy, 'has', roles('admin', 'editor')) // any of
8
+ * @Can(RolePolicy, 'hasAll', roles('admin', 'editor')) // all of
9
+ * ```
10
+ *
11
+ * Roles come from `user.roles` / `user.role` (or `resolveRoles`) and from the RBAC
12
+ * adapter's role store, scoped to the current tenant. Honors `superAdmin`.
13
+ */
14
+ export declare class RolePolicy extends AuthzPolicy {
15
+ private readonly rbac;
16
+ constructor(rbac: AuthzRbac);
17
+ /**
18
+ * Asks only `superAdmin`: the abilities here name roles, not a resource, so the
19
+ * external decision point is not consulted.
20
+ */
21
+ before(user: unknown, ability: string): Promise<true | undefined>;
22
+ /** The user holds any of `roles`. */
23
+ has(user: unknown, ...roles: string[]): Promise<boolean>;
24
+ /** The user holds every one of `roles`. */
25
+ hasAll(user: unknown, ...roles: string[]): Promise<boolean>;
26
+ }
27
+ //# sourceMappingURL=role.policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.policy.d.ts","sourceRoot":"","sources":["../../src/policies/role.policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;;GAUG;AACH,qBACa,UAAW,SAAQ,WAAW;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,SAAS;IAI5C;;;OAGG;IACM,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAI1E,qCAAqC;IACrC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxD,2CAA2C;IAC3C,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAG5D"}
@@ -0,0 +1,51 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Policy } from '@nestjs/authorization';
11
+ import { AuthzRbac } from '../rbac.js';
12
+ import { AuthzPolicy, superAdminBefore } from './authz-policy.js';
13
+ /**
14
+ * Persisted (and user-object) roles as an official policy.
15
+ *
16
+ * ```ts
17
+ * @Can(RolePolicy, 'has', roles('admin', 'editor')) // any of
18
+ * @Can(RolePolicy, 'hasAll', roles('admin', 'editor')) // all of
19
+ * ```
20
+ *
21
+ * Roles come from `user.roles` / `user.role` (or `resolveRoles`) and from the RBAC
22
+ * adapter's role store, scoped to the current tenant. Honors `superAdmin`.
23
+ */
24
+ let RolePolicy = class RolePolicy extends AuthzPolicy {
25
+ rbac;
26
+ constructor(rbac) {
27
+ super();
28
+ this.rbac = rbac;
29
+ }
30
+ /**
31
+ * Asks only `superAdmin`: the abilities here name roles, not a resource, so the
32
+ * external decision point is not consulted.
33
+ */
34
+ before(user, ability) {
35
+ return superAdminBefore(user, ability);
36
+ }
37
+ /** The user holds any of `roles`. */
38
+ has(user, ...roles) {
39
+ return this.rbac.hasAnyRole(user, roles);
40
+ }
41
+ /** The user holds every one of `roles`. */
42
+ hasAll(user, ...roles) {
43
+ return this.rbac.hasAllRoles(user, roles);
44
+ }
45
+ };
46
+ RolePolicy = __decorate([
47
+ Policy(),
48
+ __metadata("design:paramtypes", [AuthzRbac])
49
+ ], RolePolicy);
50
+ export { RolePolicy };
51
+ //# sourceMappingURL=role.policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.policy.js","sourceRoot":"","sources":["../../src/policies/role.policy.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;;GAUG;AAEI,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,WAAW;IACZ;IAA7B,YAA6B,IAAe;QAC1C,KAAK,EAAE,CAAC;QADmB,SAAI,GAAJ,IAAI,CAAW;IAE5C,CAAC;IAED;;;OAGG;IACM,MAAM,CAAC,IAAa,EAAE,OAAe;QAC5C,OAAO,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,qCAAqC;IACrC,GAAG,CAAC,IAAa,EAAE,GAAG,KAAe;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,2CAA2C;IAC3C,MAAM,CAAC,IAAa,EAAE,GAAG,KAAe;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF,CAAA;AAtBY,UAAU;IADtB,MAAM,EAAE;qCAE4B,SAAS;GADjC,UAAU,CAsBtB"}
@@ -0,0 +1,51 @@
1
+ import { type Type } from '@nestjs/common';
2
+ import { DiscoveryService, ModuleRef, ModulesContainer } from '@nestjs/core';
3
+ /** One official policy of the application, as the extras see it. */
4
+ export interface IndexedPolicy {
5
+ policy: Type<unknown>;
6
+ /** The instance the official registry uses (an `overrideProvider` replacement in tests). */
7
+ instance: object;
8
+ /** The resource linked with `@PolicyFor`, if any. */
9
+ resource: Type<unknown> | undefined;
10
+ }
11
+ /**
12
+ * The application's official `@Policy()` providers and their resource links. Read-only:
13
+ * the official `PolicyRegistry` owns registration; this only looks them up for the
14
+ * extras (resource → policy, `scope()`, ability listings).
15
+ */
16
+ export declare class PolicyIndex {
17
+ private readonly discovery;
18
+ private readonly moduleRef;
19
+ private readonly modules;
20
+ /** The last scan, reused while the container's shape (modules, providers) is unchanged. */
21
+ private cache;
22
+ constructor(discovery: DiscoveryService, moduleRef: ModuleRef, modules: ModulesContainer);
23
+ /**
24
+ * Every official policy registered as a provider, built-ins included. Rescanned when a
25
+ * module or provider is added (a lazy module) or a policy was not instantiated yet.
26
+ */
27
+ all(): IndexedPolicy[];
28
+ /** Cheap fingerprint of the container: module count and each module's provider count. */
29
+ private signature;
30
+ /** Official policies about a resource (built-ins left out). */
31
+ resourcePolicies(): IndexedPolicy[];
32
+ /** The policy class linked to a resource class. */
33
+ policyFor(resource: Type<unknown>): Type<unknown> | undefined;
34
+ /** The policy class for a resource instance (by its constructor), or for a class. */
35
+ policyOf(resource: object): Type<unknown> | undefined;
36
+ /** Linked policy classes defining `ability`, for a check that names no resource. */
37
+ linkedPoliciesWith(ability: string): Type<unknown>[];
38
+ /** The policy instance the app uses for `policy`, or `undefined` when it is not registered. */
39
+ instanceOf(policy: Type<unknown>): object | undefined;
40
+ /**
41
+ * Abilities of each resource policy that take no argument after the user (arity
42
+ * `<= 1`, e.g. `create(user)`), safe to check without a record. `before`, `scope` and
43
+ * the constructor are not abilities.
44
+ */
45
+ classAbilities(): Array<{
46
+ policy: Type<unknown>;
47
+ resource: Type<unknown> | undefined;
48
+ abilities: string[];
49
+ }>;
50
+ }
51
+ //# sourceMappingURL=policy-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-index.d.ts","sourceRoot":"","sources":["../src/policy-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAO7E,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,4FAA4F;IAC5F,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;CACrC;AAED;;;;GAIG;AACH,qBACa,WAAW;IAKpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,2FAA2F;IAC3F,OAAO,CAAC,KAAK,CAA+D;gBAGzD,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,gBAAgB;IAG5C;;;OAGG;IACH,GAAG,IAAI,aAAa,EAAE;IA6BtB,yFAAyF;IACzF,OAAO,CAAC,SAAS;IAMjB,+DAA+D;IAC/D,gBAAgB,IAAI,aAAa,EAAE;IAInC,mDAAmD;IACnD,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS;IAI7D,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS;IAKrD,oFAAoF;IACpF,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE;IAMpD,+FAA+F;IAC/F,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS;IAUrD;;;;OAIG;IACH,cAAc,IAAI,KAAK,CAAC;QACtB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;QACpC,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CAeH"}
@@ -0,0 +1,135 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Injectable } from '@nestjs/common';
11
+ import { DiscoveryService, ModuleRef, ModulesContainer } from '@nestjs/core';
12
+ import { getPolicyResource, policyForResource, policyLinks } from './links.js';
13
+ import { isOfficialPolicy } from './official.js';
14
+ /** Built-in policies that are not about a resource; left out of ability listings. */
15
+ const BUILT_IN = new Set(['RolePolicy', 'PermissionPolicy', 'GatePolicy']);
16
+ /**
17
+ * The application's official `@Policy()` providers and their resource links. Read-only:
18
+ * the official `PolicyRegistry` owns registration; this only looks them up for the
19
+ * extras (resource → policy, `scope()`, ability listings).
20
+ */
21
+ let PolicyIndex = class PolicyIndex {
22
+ discovery;
23
+ moduleRef;
24
+ modules;
25
+ /** The last scan, reused while the container's shape (modules, providers) is unchanged. */
26
+ cache;
27
+ constructor(discovery, moduleRef, modules) {
28
+ this.discovery = discovery;
29
+ this.moduleRef = moduleRef;
30
+ this.modules = modules;
31
+ }
32
+ /**
33
+ * Every official policy registered as a provider, built-ins included. Rescanned when a
34
+ * module or provider is added (a lazy module) or a policy was not instantiated yet.
35
+ */
36
+ all() {
37
+ const signature = this.signature();
38
+ if (this.cache?.signature === signature)
39
+ return this.cache.policies;
40
+ const seen = new Set();
41
+ const out = [];
42
+ let complete = true;
43
+ for (const wrapper of this.discovery.getProviders()) {
44
+ const token = wrapper.token;
45
+ const key = isOfficialPolicy(token)
46
+ ? token
47
+ : !wrapper.isFactory && isOfficialPolicy(wrapper.metatype)
48
+ ? wrapper.metatype
49
+ : undefined;
50
+ if (!key || seen.has(key))
51
+ continue;
52
+ if (!wrapper.instance || typeof wrapper.instance !== 'object') {
53
+ complete = false;
54
+ continue;
55
+ }
56
+ seen.add(key);
57
+ out.push({
58
+ policy: key,
59
+ instance: wrapper.instance,
60
+ resource: getPolicyResource(key),
61
+ });
62
+ }
63
+ this.cache = complete ? { signature, policies: out } : undefined;
64
+ return out;
65
+ }
66
+ /** Cheap fingerprint of the container: module count and each module's provider count. */
67
+ signature() {
68
+ let out = String(this.modules.size);
69
+ for (const module of this.modules.values())
70
+ out += `,${module.providers.size}`;
71
+ return out;
72
+ }
73
+ /** Official policies about a resource (built-ins left out). */
74
+ resourcePolicies() {
75
+ return this.all().filter((p) => !BUILT_IN.has(p.policy.name));
76
+ }
77
+ /** The policy class linked to a resource class. */
78
+ policyFor(resource) {
79
+ return policyForResource(resource);
80
+ }
81
+ /** The policy class for a resource instance (by its constructor), or for a class. */
82
+ policyOf(resource) {
83
+ if (typeof resource === 'function')
84
+ return policyForResource(resource);
85
+ return policyForResource(resource.constructor);
86
+ }
87
+ /** Linked policy classes defining `ability`, for a check that names no resource. */
88
+ linkedPoliciesWith(ability) {
89
+ return policyLinks()
90
+ .map((l) => l.policy)
91
+ .filter((p) => typeof p.prototype[ability] === 'function');
92
+ }
93
+ /** The policy instance the app uses for `policy`, or `undefined` when it is not registered. */
94
+ instanceOf(policy) {
95
+ const indexed = this.all().find((p) => p.policy === policy);
96
+ if (indexed)
97
+ return indexed.instance;
98
+ try {
99
+ return this.moduleRef.get(policy, { strict: false });
100
+ }
101
+ catch {
102
+ return undefined;
103
+ }
104
+ }
105
+ /**
106
+ * Abilities of each resource policy that take no argument after the user (arity
107
+ * `<= 1`, e.g. `create(user)`), safe to check without a record. `before`, `scope` and
108
+ * the constructor are not abilities.
109
+ */
110
+ classAbilities() {
111
+ return this.resourcePolicies().map(({ policy, instance, resource }) => {
112
+ const abilities = new Set();
113
+ let proto = Object.getPrototypeOf(instance);
114
+ while (proto && proto !== Object.prototype) {
115
+ for (const name of Object.getOwnPropertyNames(proto)) {
116
+ if (name === 'constructor' || name === 'before' || name === 'scope')
117
+ continue;
118
+ const member = instance[name];
119
+ if (typeof member === 'function' && member.length <= 1)
120
+ abilities.add(name);
121
+ }
122
+ proto = Object.getPrototypeOf(proto);
123
+ }
124
+ return { policy, resource, abilities: [...abilities] };
125
+ });
126
+ }
127
+ };
128
+ PolicyIndex = __decorate([
129
+ Injectable(),
130
+ __metadata("design:paramtypes", [DiscoveryService,
131
+ ModuleRef,
132
+ ModulesContainer])
133
+ ], PolicyIndex);
134
+ export { PolicyIndex };
135
+ //# sourceMappingURL=policy-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-index.js","sourceRoot":"","sources":["../src/policy-index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,qFAAqF;AACrF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC,CAAC;AAW3E;;;;GAIG;AAEI,IAAM,WAAW,GAAjB,MAAM,WAAW;IAKH;IACA;IACA;IANnB,2FAA2F;IACnF,KAAK,CAA+D;IAE5E,YACmB,SAA2B,EAC3B,SAAoB,EACpB,OAAyB;QAFzB,cAAS,GAAT,SAAS,CAAkB;QAC3B,cAAS,GAAT,SAAS,CAAW;QACpB,YAAO,GAAP,OAAO,CAAkB;IACzC,CAAC;IAEJ;;;OAGG;IACH,GAAG;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,KAAK,EAAE,SAAS,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACpE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;QAChC,MAAM,GAAG,GAAoB,EAAE,CAAC;QAChC,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC5B,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC;gBACjC,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACxD,CAAC,CAAE,OAAO,CAAC,QAA0B;oBACrC,CAAC,CAAC,SAAS,CAAC;YAChB,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YACpC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC9D,QAAQ,GAAG,KAAK,CAAC;gBACjB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,GAAG;gBACX,QAAQ,EAAE,OAAO,CAAC,QAAkB;gBACpC,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC;aACjC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,yFAAyF;IACjF,SAAS;QACf,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,GAAG,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/E,OAAO,GAAG,CAAC;IACb,CAAC;IAED,+DAA+D;IAC/D,gBAAgB;QACd,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,mDAAmD;IACnD,SAAS,CAAC,QAAuB;QAC/B,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,qFAAqF;IACrF,QAAQ,CAAC,QAAgB;QACvB,IAAI,OAAO,QAAQ,KAAK,UAAU;YAAE,OAAO,iBAAiB,CAAC,QAAyB,CAAC,CAAC;QACxF,OAAO,iBAAiB,CAAE,QAA2C,CAAC,WAAW,CAAC,CAAC;IACrF,CAAC;IAED,oFAAoF;IACpF,kBAAkB,CAAC,OAAe;QAChC,OAAO,WAAW,EAAE;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAQ,CAAC,CAAC,SAAqC,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC;IAC5F,CAAC;IAED,+FAA+F;IAC/F,UAAU,CAAC,MAAqB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC5D,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAW,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,cAAc;QAKZ,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;YACpE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;YACpC,IAAI,KAAK,GAAkB,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC3D,OAAO,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC3C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrD,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO;wBAAE,SAAS;oBAC9E,MAAM,MAAM,GAAI,QAAoC,CAAC,IAAI,CAAC,CAAC;oBAC3D,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;wBAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC9E,CAAC;gBACD,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AA5GY,WAAW;IADvB,UAAU,EAAE;qCAMmB,gBAAgB;QAChB,SAAS;QACX,gBAAgB;GAPjC,WAAW,CA4GvB"}
package/dist/rbac.d.ts ADDED
@@ -0,0 +1,92 @@
1
+ import { type OnModuleInit } from '@nestjs/common';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ import type { ContextAccessor } from './context-accessor.js';
4
+ import type { DecisionProvider } from './decision-provider.js';
5
+ import { PermissionCache } from './permission-cache.js';
6
+ import type { PermissionProvider } from './permission-provider.js';
7
+ import { type RoleProvider } from './role-provider.js';
8
+ import type { AuthzModuleOptions, Resource, User } from './types.js';
9
+ /**
10
+ * Roles and permissions of a user, from the persisted RBAC seams (`ROLE_PROVIDER`,
11
+ * `PERMISSION_PROVIDER`, registered by the TypeORM / MikroORM / Prisma / Drizzle adapters)
12
+ * and from the user object itself (`user.roles` / `user.role`); the optional external
13
+ * decision point (`DECISION_PROVIDER`); and the ambient user for `Gate` calls made without
14
+ * one. Shared by `RolePolicy`, `PermissionPolicy`, `AuthzPolicy` and the `Gate`.
15
+ *
16
+ * Within one request (a nestjs-context store), a user's permissions and provider roles
17
+ * are fetched once, however many checks run, in guards and in handlers alike.
18
+ */
19
+ export declare class AuthzRbac implements OnModuleInit {
20
+ private readonly context?;
21
+ private readonly moduleRef?;
22
+ private readonly permissionProvider?;
23
+ private readonly roleProvider?;
24
+ private readonly decisionProvider?;
25
+ private readonly roleResolver;
26
+ private readonly resolveUser;
27
+ private readonly lookups;
28
+ private authentication;
29
+ constructor(options: AuthzModuleOptions | undefined, context?: ContextAccessor | undefined, moduleRef?: ModuleRef | undefined, permissionProvider?: PermissionProvider | undefined, roleProvider?: RoleProvider | undefined, decisionProvider?: DecisionProvider | undefined);
30
+ /**
31
+ * Finds `@nestjs/authentication`'s `AuthenticationContext` when that optional peer is
32
+ * installed and its module is imported. The class is the DI token, so the package is
33
+ * loaded only here, and its absence is not an error.
34
+ */
35
+ onModuleInit(): Promise<void>;
36
+ /**
37
+ * A provider registered by any module: the injected one, else a non-strict lookup,
38
+ * memoized, so a global RBAC module or a root-level accessor is found too.
39
+ */
40
+ private lookup;
41
+ /** @internal The nestjs-context accessor, when one is registered. */
42
+ contextAccessor(): ContextAccessor | undefined;
43
+ /** The persisted permission seam, when an RBAC adapter registered one. */
44
+ permissions(): PermissionProvider | undefined;
45
+ /** The persisted role seam, when an RBAC adapter registered one. */
46
+ roles(): RoleProvider | undefined;
47
+ /** The external decision point (Cerbos, OPA, …), when one is registered. */
48
+ decisions(): DecisionProvider | undefined;
49
+ /**
50
+ * The user for a `Gate` call made without one:
51
+ *
52
+ * 1. `@nestjs/authentication`'s `AuthenticationContext.user`, when that optional peer is
53
+ * installed and its scope is active (a call it handles, or `AuthenticationContext.run()`):
54
+ * its answer is final, so a `null` there is a guest;
55
+ * 2. else, with no authentication scope at all, nestjs-context's user ref, hydrated by
56
+ * `resolveUser` when configured (once per `type:id` per request);
57
+ * 3. else `null` (a guest).
58
+ */
59
+ currentUser(): Promise<User>;
60
+ /**
61
+ * `AuthenticationContext.user` (`null` for an anonymous call) when its scope is active;
62
+ * `undefined` without the package or outside its scope. A version that hides the scope is
63
+ * read as before: a user is an answer, `null` is not.
64
+ */
65
+ private authenticatedUser;
66
+ /** The nestjs-context store for the current request, or `undefined` when there is none. */
67
+ private requestStore;
68
+ /**
69
+ * The per-request {@link PermissionCache} on the nestjs-context store, so every check
70
+ * in one request shares a single `getPermissions` and `getRoles` fetch per user.
71
+ * `undefined` without a store.
72
+ */
73
+ requestCache(): PermissionCache | undefined;
74
+ /**
75
+ * The user's role names: the role resolver's (the user object) and the role provider's,
76
+ * the latter fetched through `cache` (the request's, by default).
77
+ */
78
+ rolesOf(user: User, cache?: PermissionCache | undefined): Promise<Set<string>>;
79
+ /** True when the user holds any of `roles`. A guest holds none. */
80
+ hasAnyRole(user: User, roles: readonly string[], cache?: PermissionCache | undefined): Promise<boolean>;
81
+ /** True when the user holds every one of `roles`. */
82
+ hasAllRoles(user: User, roles: readonly string[]): Promise<boolean>;
83
+ /**
84
+ * True when the permission seam grants `permission` to `user`. With `getPermissions`,
85
+ * wildcard grants apply (`posts.*` satisfies `posts.update`, `*` anything), fetched
86
+ * once per `cache` (the request's, by default). A set the provider marks
87
+ * `exhaustivePermissions` answers on its own; otherwise a miss still asks the
88
+ * exact-match `hasPermission`. A guest, or no seam, is never granted.
89
+ */
90
+ grants(user: User, permission: string, resource?: Resource, cache?: PermissionCache | undefined): Promise<boolean>;
91
+ }
92
+ //# sourceMappingURL=rbac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../src/rbac.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,YAAY,EAAY,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,KAAK,YAAY,EAA0C,MAAM,oBAAoB,CAAC;AAQ/F,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAsBrE;;;;;;;;;GASG;AACH,qBACa,SAAU,YAAW,YAAY;IAQD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAGvC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAb3E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoC;IAChE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,cAAc,CAAwC;gBAGlB,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvB,OAAO,CAAC,EAAE,eAAe,YAAA,EACtD,SAAS,CAAC,EAAE,SAAS,YAAA,EAGjC,kBAAkB,CAAC,EAAE,kBAAkB,YAAA,EACJ,YAAY,CAAC,EAAE,YAAY,YAAA,EACvB,gBAAgB,CAAC,EAAE,gBAAgB,YAAA;IAM7F;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBnC;;;OAGG;IACH,OAAO,CAAC,MAAM;IAcd,qEAAqE;IACrE,eAAe,IAAI,eAAe,GAAG,SAAS;IAI9C,0EAA0E;IAC1E,WAAW,IAAI,kBAAkB,GAAG,SAAS;IAI7C,oEAAoE;IACpE,KAAK,IAAI,YAAY,GAAG,SAAS;IAIjC,4EAA4E;IAC5E,SAAS,IAAI,gBAAgB,GAAG,SAAS;IAIzC;;;;;;;;;OASG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BlC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAczB,2FAA2F;IAC3F,OAAO,CAAC,YAAY;IAYpB;;;;OAIG;IACH,YAAY,IAAI,eAAe,GAAG,SAAS;IAU3C;;;OAGG;IACG,OAAO,CACX,IAAI,EAAE,IAAI,EACV,KAAK,GAAE,eAAe,GAAG,SAA+B,GACvD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAiBvB,mEAAmE;IAC7D,UAAU,CACd,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,CAAC,EAAE,eAAe,GAAG,SAAS,GAClC,OAAO,CAAC,OAAO,CAAC;IAMnB,qDAAqD;IAC/C,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAMzE;;;;;;OAMG;IACG,MAAM,CACV,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,QAAQ,EACnB,KAAK,GAAE,eAAe,GAAG,SAA+B,GACvD,OAAO,CAAC,OAAO,CAAC;CAgBpB"}