vona-module-a-rbac 5.0.1

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 (49) hide show
  1. package/LICENSE +21 -0
  2. package/dist/.metadata/index.d.ts +110 -0
  3. package/dist/.metadata/index.d.ts.map +1 -0
  4. package/dist/.metadata/this.d.ts +3 -0
  5. package/dist/.metadata/this.d.ts.map +1 -0
  6. package/dist/bean/bean.rbacCatalog.d.ts +13 -0
  7. package/dist/bean/bean.rbacCatalog.d.ts.map +1 -0
  8. package/dist/bean/bean.rbacScope.d.ts +19 -0
  9. package/dist/bean/bean.rbacScope.d.ts.map +1 -0
  10. package/dist/bean/event.policyInvalidated.d.ts +11 -0
  11. package/dist/bean/event.policyInvalidated.d.ts.map +1 -0
  12. package/dist/bean/event.resolvePolicy.d.ts +7 -0
  13. package/dist/bean/event.resolvePolicy.d.ts.map +1 -0
  14. package/dist/bean/guard.rbac.d.ts +17 -0
  15. package/dist/bean/guard.rbac.d.ts.map +1 -0
  16. package/dist/bean/index.d.ts +6 -0
  17. package/dist/bean/index.d.ts.map +1 -0
  18. package/dist/config/config.d.ts +8 -0
  19. package/dist/config/config.d.ts.map +1 -0
  20. package/dist/index.d.ts +4 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +365 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/lib/index.d.ts +2 -0
  25. package/dist/lib/index.d.ts.map +1 -0
  26. package/dist/lib/rbac.d.ts +12 -0
  27. package/dist/lib/rbac.d.ts.map +1 -0
  28. package/dist/types/index.d.ts +3 -0
  29. package/dist/types/index.d.ts.map +1 -0
  30. package/dist/types/rbac.d.ts +37 -0
  31. package/dist/types/rbac.d.ts.map +1 -0
  32. package/dist/types/scope.d.ts +21 -0
  33. package/dist/types/scope.d.ts.map +1 -0
  34. package/package.json +46 -0
  35. package/src/.metadata/index.ts +147 -0
  36. package/src/.metadata/this.ts +2 -0
  37. package/src/bean/bean.rbacCatalog.ts +95 -0
  38. package/src/bean/bean.rbacScope.ts +218 -0
  39. package/src/bean/event.policyInvalidated.ts +17 -0
  40. package/src/bean/event.resolvePolicy.ts +13 -0
  41. package/src/bean/guard.rbac.ts +102 -0
  42. package/src/bean/index.ts +5 -0
  43. package/src/config/config.ts +10 -0
  44. package/src/index.ts +3 -0
  45. package/src/lib/index.ts +1 -0
  46. package/src/lib/rbac.ts +46 -0
  47. package/src/types/index.ts +2 -0
  48. package/src/types/rbac.ts +46 -0
  49. package/src/types/scope.ts +27 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/lib/rbac.ts","../src/bean/guard.rbac.ts","../src/bean/bean.rbacCatalog.ts","../src/bean/bean.rbacScope.ts","../src/bean/event.policyInvalidated.ts","../src/bean/event.resolvePolicy.ts","../src/config/config.ts","../src/.metadata/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":["SymbolRbacDecision","Symbol","createRbacAllScopeDecision","action","allowed","actionKey","terms","dataScope","createRbacCapability","key","isRbacCapability","value","capability","Object","keys","every","length","hasRbacAllScope","decision","some","term","rbacActionKey","controllerBeanFullName","getRbacDecision","ctx","setRbacDecision","clearRbacDecision","GuardRbac","GuardBase","check","options","bean","rbacCatalog","getAction","route","effectiveAction","rbacScope","isUnrestricted","scope","event","resolvePolicy","emit","policyActionKey","actionInheritKey","undefined","isValidDecision","isValidAction","revision","isValidTerms","descriptor","Array","isArray","isValidTerm","ownerId","isDepartmentDataScope","departmentIds","id","includes","__decorate","Guard","dataScopeField","dataScopeMineField","__z_BeanInfo","module","BeanFullNameGuardRbac","beanFullNameFromOnionName","BeanRbacCatalog","BeanBase","constructor","args","_catalog","getCatalog","get","createCatalog","clear","catalog","Map","routesByController","getCacheControllerRoutes","app","routes","values","meta","set","freeze","resolveActionInherit","actionInherit","routesByAction","map","resolveActionInheritKey","seen","Set","current","Error","targetKey","has","add","target","Bean","BeanRbacScope","_scopeAdapter","scopeAdapter","resolveAction","throw","isDecisionForAction","unrestricted","ownerValues","prepareOwnerValues","createAccess","beanFullName","config","adapter","_getBean","departmentField","ownerField","departmentId","userIdOwner","matches","where","callerWhere","checkEntry","entry","checkEntries","entries","permissionProjection","matcher","mode","rules","flatMap","field","scopeWhere","_and_","_and_0","predicates","termPredicates","_or_","row","String","Boolean","_in_","EventPolicyInvalidated","BeanEventBase","Event","EventResolvePolicy","_app","ScopeModuleARbac","BeanScopeBase","Scope"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './rbac.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { VonaContext } from 'vona';
2
+ import type { IRbacCapability, IRbacPolicyDecision } from '../types/rbac.ts';
3
+ export declare const SymbolRbacDecision: unique symbol;
4
+ export declare function createRbacAllScopeDecision(action: IRbacPolicyDecision['action']): IRbacPolicyDecision;
5
+ export declare function createRbacCapability(key: string, allowed: boolean): IRbacCapability;
6
+ export declare function isRbacCapability(value: unknown): value is IRbacCapability;
7
+ export declare function hasRbacAllScope(decision: IRbacPolicyDecision): boolean;
8
+ export declare function rbacActionKey(controllerBeanFullName: string, action: string): string;
9
+ export declare function getRbacDecision(ctx: VonaContext): IRbacPolicyDecision | undefined;
10
+ export declare function setRbacDecision(ctx: VonaContext, decision: IRbacPolicyDecision): void;
11
+ export declare function clearRbacDecision(ctx: VonaContext): void;
12
+ //# sourceMappingURL=rbac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../../src/lib/rbac.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,eAAO,MAAM,kBAAkB,eAA+B,CAAC;AAE/D,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GACpC,mBAAmB,CAErB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe,CAEnF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CASzE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAEtE;AAED,wBAAgB,aAAa,CAAC,sBAAsB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,mBAAmB,GAAG,SAAS,CAEjF;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAErF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAExD"}
@@ -0,0 +1,3 @@
1
+ export * from './rbac.ts';
2
+ export * from './scope.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { ContextRoute } from 'vona-module-a-web';
2
+ import type { IGuardOptionsRbac } from '../bean/guard.rbac.ts';
3
+ export type TypeRbacDataScope = 'all' | 'customDepartments' | 'ownDepartment' | 'ownDepartmentAndDescendants' | 'mine';
4
+ export interface IRbacActionDescriptor {
5
+ actionKey: string;
6
+ controllerBeanFullName: string;
7
+ action: string;
8
+ actionInheritKey?: string;
9
+ route: ContextRoute;
10
+ options: IGuardOptionsRbac;
11
+ }
12
+ export interface IRbacPolicyRequest {
13
+ action: IRbacActionDescriptor;
14
+ policyActionKey: string;
15
+ }
16
+ export type IRbacScopeTerm = {
17
+ dataScope: 'all';
18
+ } | {
19
+ dataScope: 'customDepartments' | 'ownDepartment' | 'ownDepartmentAndDescendants';
20
+ departmentIds: string[];
21
+ } | {
22
+ dataScope: 'mine';
23
+ ownerId: string;
24
+ };
25
+ export interface IRbacPolicyDecision {
26
+ allowed: boolean;
27
+ actionKey: string;
28
+ action: IRbacActionDescriptor;
29
+ terms?: IRbacScopeTerm[];
30
+ revision?: string;
31
+ }
32
+ /** A server-derived UX hint; it never grants backend authority. */
33
+ export interface IRbacCapability {
34
+ key: string;
35
+ allowed: boolean;
36
+ }
37
+ //# sourceMappingURL=rbac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../../src/types/rbac.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,MAAM,iBAAiB,GACzB,KAAK,GACL,mBAAmB,GACnB,eAAe,GACf,6BAA6B,GAC7B,MAAM,CAAC;AAEX,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,SAAS,EAAE,KAAK,CAAA;CAAE,GACpB;IACE,SAAS,EAAE,mBAAmB,GAAG,eAAe,GAAG,6BAA6B,CAAC;IACjF,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,GACD;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,21 @@
1
+ import type { TableIdentity } from 'table-identity';
2
+ import type { IOpenapiPermissionActionRbac } from 'vona-module-a-openapi';
3
+ import type { TypeModelWhere } from 'vona-module-a-orm';
4
+ import type { IRbacActionDescriptor, IRbacPolicyDecision } from './rbac.ts';
5
+ export type IRbacScopeOwnerValues = Record<string, TableIdentity | null | undefined>;
6
+ export interface IRbacScopeAdapter {
7
+ isUnrestricted(): Promise<boolean>;
8
+ ownerValues(action: IRbacActionDescriptor, decision: IRbacPolicyDecision): Promise<IRbacScopeOwnerValues>;
9
+ }
10
+ export interface IRbacScopeAccess {
11
+ action: IRbacActionDescriptor;
12
+ decision: IRbacPolicyDecision;
13
+ unrestricted: boolean;
14
+ ownerValues(): Record<string, TableIdentity | null | undefined>;
15
+ where(callerWhere?: TypeModelWhere<any>): TypeModelWhere<any> | undefined;
16
+ checkEntry(entry: object | undefined): void;
17
+ checkEntries(entries: readonly object[]): void;
18
+ /** A safe permission projection for Resource permission consumers. */
19
+ permissionProjection(): IOpenapiPermissionActionRbac;
20
+ }
21
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/types/scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAE5E,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAErF,MAAM,WAAW,iBAAiB;IAChC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,WAAW,CACT,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,EAAE,mBAAmB,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAChE,KAAK,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC1E,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/C,sEAAsE;IACtE,oBAAoB,IAAI,4BAA4B,CAAC;CACtD"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "vona-module-a-rbac",
3
+ "version": "5.0.1",
4
+ "description": "",
5
+ "keywords": [
6
+ "Vona Module"
7
+ ],
8
+ "author": "",
9
+ "files": [
10
+ "assets",
11
+ "dist",
12
+ "src"
13
+ ],
14
+ "type": "module",
15
+ "exports": {
16
+ ".": {
17
+ "types": [
18
+ "./src/index.ts",
19
+ "./dist/index.d.ts"
20
+ ],
21
+ "default": "./dist/index.js"
22
+ },
23
+ "./package.json": "./package.json"
24
+ },
25
+ "scripts": {
26
+ "clean": "rimraf dist tsconfig.build.tsbuildinfo",
27
+ "tsc:publish": "npm run clean && node ../../../../../packages-cli/cli/src/bin/vona.ts :bin:buildModule --sourcemap && tsc -p tsconfig.build.json",
28
+ "prepublishOnly": "npm run tsc:publish",
29
+ "prepack": "clean-package",
30
+ "postpack": "clean-package restore"
31
+ },
32
+ "dependencies": {
33
+ "vona-module-a-aspect": "^5.1.13",
34
+ "vona-module-a-openapi": "^5.1.23",
35
+ "vona-module-a-orm": "^5.1.30",
36
+ "vona-module-a-user": "^5.1.23",
37
+ "vona-module-a-web": "^5.1.22"
38
+ },
39
+ "title": "a-rbac",
40
+ "vonaModule": {
41
+ "dependencies": {
42
+ "a-vona": "5.0.0"
43
+ }
44
+ },
45
+ "gitHead": "eb85d771ef75776a439e56df3af8be6a3a36c1c2"
46
+ }
@@ -0,0 +1,147 @@
1
+ // eslint-disable
2
+ /** guard: begin */
3
+ export * from '../bean/guard.rbac.ts';
4
+ import type { IGuardOptionsRbac } from '../bean/guard.rbac.ts';
5
+ import 'vona-module-a-aspect';
6
+ declare module 'vona-module-a-aspect' {
7
+
8
+
9
+ export interface IGuardRecordLocal {
10
+ 'a-rbac:rbac': IGuardOptionsRbac;
11
+ }
12
+
13
+ }
14
+ declare module 'vona-module-a-rbac' {
15
+
16
+ export interface GuardRbac {
17
+ /** @internal */
18
+ get scope(): ScopeModuleARbac;
19
+ }
20
+
21
+ export interface GuardRbac {
22
+ get $beanFullName(): 'a-rbac.guard.rbac';
23
+ get $onionName(): 'a-rbac:rbac';
24
+ get $onionOptions(): IGuardOptionsRbac;
25
+ }
26
+ }
27
+ /** guard: end */
28
+ /** bean: begin */
29
+ export * from '../bean/bean.rbacCatalog.ts';
30
+ export * from '../bean/bean.rbacScope.ts';
31
+
32
+ import 'vona';
33
+ declare module 'vona' {
34
+
35
+
36
+ }
37
+ declare module 'vona-module-a-rbac' {
38
+
39
+ export interface BeanRbacCatalog {
40
+ /** @internal */
41
+ get scope(): ScopeModuleARbac;
42
+ }
43
+
44
+ export interface BeanRbacScope {
45
+ /** @internal */
46
+ get scope(): ScopeModuleARbac;
47
+ }
48
+ }
49
+ /** bean: end */
50
+ /** bean: begin */
51
+ import type { BeanRbacCatalog } from '../bean/bean.rbacCatalog.ts';
52
+ import type { BeanRbacScope } from '../bean/bean.rbacScope.ts';
53
+ import 'vona';
54
+ declare module 'vona' {
55
+ export interface IBeanRecordGlobal {
56
+ 'rbacCatalog': BeanRbacCatalog;
57
+ 'rbacScope': BeanRbacScope;
58
+ }
59
+ }
60
+ /** bean: end */
61
+ /** event: begin */
62
+ export * from '../bean/event.policyInvalidated.ts';
63
+ export * from '../bean/event.resolvePolicy.ts';
64
+
65
+ import 'vona';
66
+ declare module 'vona' {
67
+
68
+
69
+ }
70
+ declare module 'vona-module-a-rbac' {
71
+
72
+ export interface EventPolicyInvalidated {
73
+ /** @internal */
74
+ get scope(): ScopeModuleARbac;
75
+ }
76
+
77
+ export interface EventPolicyInvalidated {
78
+ get $beanFullName(): 'a-rbac.event.policyInvalidated';
79
+ get $onionName(): 'a-rbac:policyInvalidated';
80
+ }
81
+
82
+ export interface EventResolvePolicy {
83
+ /** @internal */
84
+ get scope(): ScopeModuleARbac;
85
+ }
86
+
87
+ export interface EventResolvePolicy {
88
+ get $beanFullName(): 'a-rbac.event.resolvePolicy';
89
+ get $onionName(): 'a-rbac:resolvePolicy';
90
+ }
91
+ }
92
+ /** event: end */
93
+ /** event: begin */
94
+ import type { EventPolicyInvalidated } from '../bean/event.policyInvalidated.ts';
95
+ import type { EventResolvePolicy } from '../bean/event.resolvePolicy.ts';
96
+ export interface IModuleEvent {
97
+ 'policyInvalidated': EventPolicyInvalidated;
98
+ 'resolvePolicy': EventResolvePolicy;
99
+ }
100
+ /** event: end */
101
+ /** event: begin */
102
+ import type { TypeEventPolicyInvalidatedData, TypeEventPolicyInvalidatedResult } from '../bean/event.policyInvalidated.ts';
103
+ import type { TypeEventResolvePolicyData, TypeEventResolvePolicyResult } from '../bean/event.resolvePolicy.ts';
104
+ import type { EventOn } from 'vona-module-a-event';
105
+ declare module 'vona-module-a-event' {
106
+ export interface IEventRecord {
107
+ 'a-rbac:policyInvalidated': EventOn<TypeEventPolicyInvalidatedData, TypeEventPolicyInvalidatedResult>;
108
+ 'a-rbac:resolvePolicy': EventOn<TypeEventResolvePolicyData, TypeEventResolvePolicyResult>;
109
+ }
110
+ }
111
+ /** event: end */
112
+ /** config: begin */
113
+ export * from '../config/config.ts';
114
+ import type { config } from '../config/config.ts';
115
+ /** config: end */
116
+ /** scope: begin */
117
+ import { BeanScopeBase, type BeanScopeUtil, type TypeModuleConfig } from 'vona';
118
+ import { Scope } from 'vona-module-a-bean';
119
+
120
+ @Scope()
121
+ export class ScopeModuleARbac extends BeanScopeBase {}
122
+
123
+ export interface ScopeModuleARbac {
124
+ util: BeanScopeUtil;
125
+ config: TypeModuleConfig<typeof config>;
126
+ event: IModuleEvent;
127
+ }
128
+
129
+ import 'vona';
130
+ declare module 'vona' {
131
+ export interface IBeanScopeRecord {
132
+ 'a-rbac': ScopeModuleARbac;
133
+ }
134
+
135
+ export interface IBeanScopeContainer {
136
+ rbac: ScopeModuleARbac;
137
+ }
138
+
139
+ export interface IBeanScopeConfig {
140
+ 'a-rbac': ReturnType<typeof config>;
141
+ }
142
+
143
+
144
+
145
+
146
+ }
147
+ /** scope: end */
@@ -0,0 +1,2 @@
1
+ export const __ThisModule__ = 'a-rbac';
2
+ export { ScopeModuleARbac as ScopeModule } from './index.ts';
@@ -0,0 +1,95 @@
1
+ import type { ContextRoute } from 'vona-module-a-web';
2
+
3
+ import { beanFullNameFromOnionName, BeanBase } from 'vona';
4
+ import { Bean } from 'vona-module-a-bean';
5
+ import { getCacheControllerRoutes } from 'vona-module-a-web';
6
+
7
+ import type { IRbacActionDescriptor } from '../types/rbac.ts';
8
+ import type { IGuardOptionsRbac } from './guard.rbac.ts';
9
+
10
+ import { rbacActionKey } from '../lib/rbac.ts';
11
+
12
+ const BeanFullNameGuardRbac = beanFullNameFromOnionName('a-rbac:rbac', 'guard');
13
+
14
+ @Bean()
15
+ export class BeanRbacCatalog extends BeanBase {
16
+ private _catalog: Map<string, IRbacActionDescriptor> | undefined;
17
+
18
+ getAction(route: ContextRoute): IRbacActionDescriptor | undefined {
19
+ return this.getCatalog().get(rbacActionKey(route.controllerBeanFullName, route.action));
20
+ }
21
+
22
+ getCatalog(): ReadonlyMap<string, IRbacActionDescriptor> {
23
+ if (!this._catalog) this._catalog = this.createCatalog();
24
+ return this._catalog;
25
+ }
26
+
27
+ clear(): void {
28
+ this._catalog = undefined;
29
+ }
30
+
31
+ private createCatalog(): Map<string, IRbacActionDescriptor> {
32
+ const catalog = new Map<string, IRbacActionDescriptor>();
33
+ const routesByController = getCacheControllerRoutes(this.app);
34
+ for (const routes of Object.values(routesByController)) {
35
+ for (const route of routes) {
36
+ const options = route.route.meta?.[BeanFullNameGuardRbac] as IGuardOptionsRbac | undefined;
37
+ if (!options) continue;
38
+ const actionKey = rbacActionKey(route.controllerBeanFullName, route.action);
39
+ catalog.set(actionKey, {
40
+ actionKey,
41
+ controllerBeanFullName: route.controllerBeanFullName,
42
+ action: route.action,
43
+ route,
44
+ options: Object.freeze({ ...options }),
45
+ });
46
+ }
47
+ }
48
+ this.resolveActionInherit(catalog, routesByController);
49
+ return catalog;
50
+ }
51
+
52
+ private resolveActionInherit(
53
+ catalog: ReadonlyMap<string, IRbacActionDescriptor>,
54
+ routesByController: Record<string, ContextRoute[]>,
55
+ ): void {
56
+ for (const descriptor of catalog.values()) {
57
+ if (!descriptor.options.actionInherit) continue;
58
+ const routes = routesByController[descriptor.controllerBeanFullName] ?? [];
59
+ const routesByAction = new Map(routes.map(route => [route.action, route]));
60
+ descriptor.actionInheritKey = this.resolveActionInheritKey(
61
+ descriptor,
62
+ catalog,
63
+ routesByAction,
64
+ );
65
+ }
66
+ }
67
+
68
+ private resolveActionInheritKey(
69
+ descriptor: IRbacActionDescriptor,
70
+ catalog: ReadonlyMap<string, IRbacActionDescriptor>,
71
+ routesByAction: ReadonlyMap<string, ContextRoute>,
72
+ ): string {
73
+ const seen = new Set<string>([descriptor.actionKey]);
74
+ let current = descriptor;
75
+ while (current.options.actionInherit) {
76
+ const action = current.options.actionInherit;
77
+ if (action === current.action) {
78
+ throw new Error(`RBAC actionInherit cannot reference itself: ${current.actionKey}`);
79
+ }
80
+ const route = routesByAction.get(action);
81
+ if (!route) {
82
+ throw new Error(`RBAC actionInherit target not found: ${current.actionKey} -> ${action}`);
83
+ }
84
+ const targetKey = rbacActionKey(current.controllerBeanFullName, action);
85
+ if (seen.has(targetKey)) {
86
+ throw new Error(`RBAC actionInherit cycle: ${descriptor.actionKey}`);
87
+ }
88
+ seen.add(targetKey);
89
+ const target = catalog.get(targetKey);
90
+ if (!target) return targetKey;
91
+ current = target;
92
+ }
93
+ return current.actionKey;
94
+ }
95
+ }
@@ -0,0 +1,218 @@
1
+ import type { TableIdentity } from 'table-identity';
2
+ import type { TypeModelWhere } from 'vona-module-a-orm';
3
+
4
+ import { BeanBase, beanFullNameFromOnionName } from 'vona';
5
+ import { Bean } from 'vona-module-a-bean';
6
+
7
+ import type { IRbacActionDescriptor, IRbacPolicyDecision, IRbacScopeTerm } from '../types/rbac.ts';
8
+ import type { IRbacScopeAccess, IRbacScopeAdapter } from '../types/scope.ts';
9
+
10
+ import { getRbacDecision, hasRbacAllScope, rbacActionKey } from '../lib/rbac.ts';
11
+
12
+ @Bean()
13
+ export class BeanRbacScope extends BeanBase {
14
+ private _scopeAdapter: IRbacScopeAdapter | undefined;
15
+
16
+ async isUnrestricted(): Promise<boolean> {
17
+ return await this.scopeAdapter.isUnrestricted();
18
+ }
19
+
20
+ async current(actionKey?: string): Promise<IRbacScopeAccess> {
21
+ const action = this.resolveAction(actionKey);
22
+ if (!action) this.app.throw(403);
23
+
24
+ const decision = getRbacDecision(this.ctx);
25
+ if (!this.isDecisionForAction(decision, action)) this.app.throw(403);
26
+
27
+ const unrestricted = hasRbacAllScope(decision);
28
+ const ownerValues =
29
+ action.action === 'create'
30
+ ? await this.prepareOwnerValues(action, decision, unrestricted)
31
+ : undefined;
32
+ return this.createAccess(action, decision, unrestricted, ownerValues);
33
+ }
34
+
35
+ private get scopeAdapter(): IRbacScopeAdapter {
36
+ if (!this._scopeAdapter) {
37
+ const beanFullName = beanFullNameFromOnionName(
38
+ this.scope.config.adapter.rbacScope,
39
+ 'service',
40
+ );
41
+ this._scopeAdapter = this.bean._getBean(beanFullName) as unknown as IRbacScopeAdapter;
42
+ }
43
+ return this._scopeAdapter;
44
+ }
45
+
46
+ private async prepareOwnerValues(
47
+ action: IRbacActionDescriptor,
48
+ decision: IRbacPolicyDecision,
49
+ unrestricted: boolean,
50
+ ): Promise<Record<string, TableIdentity | null | undefined>> {
51
+ const values = await this.scopeAdapter.ownerValues(action, decision);
52
+ const departmentField = action.options.dataScopeField ?? 'departmentId';
53
+ const ownerField = action.options.dataScopeMineField ?? 'userIdOwner';
54
+ const ownerValues = {
55
+ [departmentField]: values.departmentId,
56
+ [ownerField]: values.userIdOwner,
57
+ };
58
+ if (!this.matches(action, decision, unrestricted, ownerValues)) this.app.throw(403);
59
+ return ownerValues;
60
+ }
61
+
62
+ private createAccess(
63
+ action: IRbacActionDescriptor,
64
+ decision: IRbacPolicyDecision,
65
+ unrestricted: boolean,
66
+ ownerValues: Record<string, TableIdentity | null | undefined> | undefined,
67
+ ): IRbacScopeAccess {
68
+ return {
69
+ action,
70
+ decision,
71
+ unrestricted,
72
+ ownerValues: () => {
73
+ if (!ownerValues) this.app.throw(500, 'RBAC scope owner values are not initialized');
74
+ return { ...ownerValues };
75
+ },
76
+ where: (callerWhere?: TypeModelWhere<any>) =>
77
+ this.where(action, decision, unrestricted, callerWhere),
78
+ checkEntry: (entry: object | undefined) => {
79
+ if (entry !== undefined && !this.matches(action, decision, unrestricted, entry)) {
80
+ this.app.throw(403);
81
+ }
82
+ },
83
+ checkEntries: (entries: readonly object[]) => {
84
+ for (const entry of entries) {
85
+ if (!this.matches(action, decision, unrestricted, entry)) this.app.throw(403);
86
+ }
87
+ },
88
+ permissionProjection: () => this.permissionProjection(action, decision, unrestricted),
89
+ };
90
+ }
91
+
92
+ private permissionProjection(
93
+ action: IRbacActionDescriptor,
94
+ decision: IRbacPolicyDecision,
95
+ unrestricted: boolean,
96
+ ) {
97
+ const matcher =
98
+ unrestricted || !action.options.dataScope
99
+ ? { mode: 'all' as const }
100
+ : {
101
+ mode: 'any' as const,
102
+ rules: (decision.terms ?? []).flatMap(term => {
103
+ if (term.dataScope === 'all') return [];
104
+ if (term.dataScope === 'mine') {
105
+ return [
106
+ {
107
+ field: action.options.dataScopeMineField ?? 'userIdOwner',
108
+ values: [term.ownerId],
109
+ },
110
+ ];
111
+ }
112
+ return [
113
+ {
114
+ field: action.options.dataScopeField ?? 'departmentId',
115
+ values: [...term.departmentIds],
116
+ },
117
+ ];
118
+ }),
119
+ };
120
+ if (matcher.mode === 'any' && matcher.rules.length === 0) this.app.throw(403);
121
+ return { key: action.actionKey, allowed: decision.allowed, matcher };
122
+ }
123
+
124
+ private where(
125
+ action: IRbacActionDescriptor,
126
+ decision: IRbacPolicyDecision,
127
+ unrestricted: boolean,
128
+ callerWhere?: TypeModelWhere<any>,
129
+ ): TypeModelWhere<any> | undefined {
130
+ if (unrestricted) return callerWhere;
131
+ const scopeWhere = this.scopeWhere(action, decision);
132
+ if (!scopeWhere) this.app.throw(403);
133
+ if (!callerWhere) return scopeWhere;
134
+ return { _and_: { _and_: callerWhere, _and_0: scopeWhere } } as TypeModelWhere<any>;
135
+ }
136
+
137
+ private scopeWhere(
138
+ action: IRbacActionDescriptor,
139
+ decision: IRbacPolicyDecision,
140
+ ): TypeModelWhere<any> | undefined {
141
+ const predicates = (decision.terms ?? []).flatMap(term => this.termPredicates(action, term));
142
+ if (!predicates.length) return undefined;
143
+ return (predicates.length === 1 ? predicates[0] : { _or_: predicates }) as TypeModelWhere<any>;
144
+ }
145
+
146
+ private matches(
147
+ action: IRbacActionDescriptor,
148
+ decision: IRbacPolicyDecision,
149
+ unrestricted: boolean,
150
+ row: object,
151
+ ): boolean {
152
+ const values = row as Record<string, unknown>;
153
+ if (unrestricted) return true;
154
+ return (decision.terms ?? []).some(term => {
155
+ if (term.dataScope === 'all') return true;
156
+ if (term.dataScope === 'mine') {
157
+ const field = action.options.dataScopeMineField ?? 'userIdOwner';
158
+ return String(values[field] ?? '') === term.ownerId;
159
+ }
160
+ const field = action.options.dataScopeField ?? 'departmentId';
161
+ return term.departmentIds.includes(String(values[field] ?? ''));
162
+ });
163
+ }
164
+
165
+ private resolveAction(actionKey?: string): IRbacActionDescriptor | undefined {
166
+ const catalog = this.bean.rbacCatalog.getCatalog();
167
+ if (actionKey) return catalog.get(actionKey);
168
+ const route = this.ctx.route;
169
+ return route
170
+ ? catalog.get(rbacActionKey(route.controllerBeanFullName, route.action))
171
+ : undefined;
172
+ }
173
+
174
+ private isDecisionForAction(
175
+ decision: IRbacPolicyDecision | undefined,
176
+ action: IRbacActionDescriptor,
177
+ ): decision is IRbacPolicyDecision {
178
+ return Boolean(
179
+ decision?.allowed &&
180
+ decision.actionKey === action.actionKey &&
181
+ decision.action.actionKey === action.actionKey &&
182
+ decision.action.actionInheritKey === action.actionInheritKey &&
183
+ decision.action.controllerBeanFullName === action.controllerBeanFullName &&
184
+ decision.action.action === action.action &&
185
+ this.isValidTerms(decision.terms),
186
+ );
187
+ }
188
+
189
+ private isValidTerms(terms: IRbacScopeTerm[] | undefined): boolean {
190
+ if (!terms?.length) return false;
191
+ return terms.every(term => {
192
+ if (term.dataScope === 'all') return true;
193
+ if (term.dataScope === 'mine')
194
+ return typeof term.ownerId === 'string' && term.ownerId.length > 0;
195
+ return (
196
+ ['customDepartments', 'ownDepartment', 'ownDepartmentAndDescendants'].includes(
197
+ term.dataScope,
198
+ ) &&
199
+ Array.isArray(term.departmentIds) &&
200
+ term.departmentIds.length > 0 &&
201
+ term.departmentIds.every(id => typeof id === 'string' && id.length > 0)
202
+ );
203
+ });
204
+ }
205
+
206
+ private termPredicates(
207
+ action: IRbacActionDescriptor,
208
+ term: IRbacScopeTerm,
209
+ ): Record<string, unknown>[] {
210
+ if (term.dataScope === 'all') return [{}];
211
+ if (term.dataScope === 'mine') {
212
+ const field = action.options.dataScopeMineField ?? 'userIdOwner';
213
+ return [{ [field]: term.ownerId }];
214
+ }
215
+ const field = action.options.dataScopeField ?? 'departmentId';
216
+ return [{ [field]: { _in_: term.departmentIds } }];
217
+ }
218
+ }