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.
- package/LICENSE +21 -0
- package/dist/.metadata/index.d.ts +110 -0
- package/dist/.metadata/index.d.ts.map +1 -0
- package/dist/.metadata/this.d.ts +3 -0
- package/dist/.metadata/this.d.ts.map +1 -0
- package/dist/bean/bean.rbacCatalog.d.ts +13 -0
- package/dist/bean/bean.rbacCatalog.d.ts.map +1 -0
- package/dist/bean/bean.rbacScope.d.ts +19 -0
- package/dist/bean/bean.rbacScope.d.ts.map +1 -0
- package/dist/bean/event.policyInvalidated.d.ts +11 -0
- package/dist/bean/event.policyInvalidated.d.ts.map +1 -0
- package/dist/bean/event.resolvePolicy.d.ts +7 -0
- package/dist/bean/event.resolvePolicy.d.ts.map +1 -0
- package/dist/bean/guard.rbac.d.ts +17 -0
- package/dist/bean/guard.rbac.d.ts.map +1 -0
- package/dist/bean/index.d.ts +6 -0
- package/dist/bean/index.d.ts.map +1 -0
- package/dist/config/config.d.ts +8 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +365 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/rbac.d.ts +12 -0
- package/dist/lib/rbac.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/rbac.d.ts +37 -0
- package/dist/types/rbac.d.ts.map +1 -0
- package/dist/types/scope.d.ts +21 -0
- package/dist/types/scope.d.ts.map +1 -0
- package/package.json +46 -0
- package/src/.metadata/index.ts +147 -0
- package/src/.metadata/this.ts +2 -0
- package/src/bean/bean.rbacCatalog.ts +95 -0
- package/src/bean/bean.rbacScope.ts +218 -0
- package/src/bean/event.policyInvalidated.ts +17 -0
- package/src/bean/event.resolvePolicy.ts +13 -0
- package/src/bean/guard.rbac.ts +102 -0
- package/src/bean/index.ts +5 -0
- package/src/config/config.ts +10 -0
- package/src/index.ts +3 -0
- package/src/lib/index.ts +1 -0
- package/src/lib/rbac.ts +46 -0
- package/src/types/index.ts +2 -0
- package/src/types/rbac.ts +46 -0
- 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":";;;;;;;MAIaA,kBAAkB,GAAGC,MAAM,CAAC,oBAAoB;AAEvD,SAAUC,0BAA0BA,CACxCC,MAAqC,EAAA;EAErC,OAAO;AAAEC,IAAAA,OAAO,EAAE,IAAI;IAAEC,SAAS,EAAEF,MAAM,CAACE,SAAS;IAAEF,MAAM;AAAEG,IAAAA,KAAK,EAAE,CAAC;AAAEC,MAAAA,SAAS,EAAE;KAAO;GAAG;AAC9F;AAEM,SAAUC,oBAAoBA,CAACC,GAAW,EAAEL,OAAgB,EAAA;EAChE,OAAO;IAAEK,GAAG;AAAEL,IAAAA;GAAS;AACzB;AAEM,SAAUM,gBAAgBA,CAACC,KAAc,EAAA;EAC7C,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAO,KAAK;EACrD,MAAMC,UAAU,GAAGD,KAAiC;AACpD,EAAA,OACEE,MAAM,CAACC,IAAI,CAACF,UAAU,CAAC,CAACG,KAAK,CAACN,GAAG,IAAIA,GAAG,KAAK,KAAK,IAAIA,GAAG,KAAK,SAAS,CAAC,IACxE,OAAOG,UAAU,CAACH,GAAG,KAAK,QAAQ,IAClCG,UAAU,CAACH,GAAG,CAACO,MAAM,GAAG,CAAC,IACzB,OAAOJ,UAAU,CAACR,OAAO,KAAK,SAAS;AAE3C;AAEM,SAAUa,eAAeA,CAACC,QAA6B,EAAA;AAC3D,EAAA,OAAOA,QAAQ,CAACZ,KAAK,EAAEa,IAAI,CAACC,IAAI,IAAIA,IAAI,CAACb,SAAS,KAAK,KAAK,CAAC,KAAK,IAAI;AACxE;AAEM,SAAUc,aAAaA,CAACC,sBAA8B,EAAEnB,MAAc,EAAA;AAC1E,EAAA,OAAO,CAAA,EAAGmB,sBAAsB,CAAA,CAAA,EAAInB,MAAM,CAAA,CAAE;AAC9C;AAEM,SAAUoB,eAAeA,CAACC,GAAgB,EAAA;EAC9C,OAAOA,GAAG,CAACxB,kBAAkB,CAAC;AAChC;AAEM,SAAUyB,eAAeA,CAACD,GAAgB,EAAEN,QAA6B,EAAA;AAC7EM,EAAAA,GAAG,CAACxB,kBAAkB,CAAC,GAAGkB,QAAQ;AACpC;AAEM,SAAUQ,iBAAiBA,CAACF,GAAgB,EAAA;EAChD,OAAOA,GAAG,CAACxB,kBAAkB,CAAC;AAChC;;ACrBO,IAAM2B,SAAS,GAAf,MAAMA,SAAU,SAAQC,SAAS,CAAA;EACtC,MAAMC,KAAKA,CAACC,OAA0B,EAAA;AACpCJ,IAAAA,iBAAiB,CAAC,IAAI,CAACF,GAAG,CAAC;AAC3B,IAAA,MAAMrB,MAAM,GAAG,IAAI,CAAC4B,IAAI,CAACC,WAAW,CAACC,SAAS,CAAC,IAAI,CAACT,GAAG,CAACU,KAAK,CAAC;AAC9D,IAAA,IAAI,CAAC/B,MAAM,EAAE,OAAO,KAAK;AACzB,IAAA,MAAMgC,eAAe,GAAG;AAAE,MAAA,GAAGhC,MAAM;AAAE2B,MAAAA,OAAO,EAAE;QAAE,GAAG3B,MAAM,CAAC2B,OAAO;QAAE,GAAGA;AAAO;KAAI;IACjF,IAAI,MAAM,IAAI,CAACC,IAAI,CAACK,SAAS,CAACC,cAAc,EAAE,EAAE;MAC9CZ,eAAe,CAAC,IAAI,CAACD,GAAG,EAAEtB,0BAA0B,CAACiC,eAAe,CAAC,CAAC;AACtE,MAAA,OAAO,IAAI;AACb,IAAA;AAEA,IAAA,MAAMjB,QAAQ,GAAG,MAAM,IAAI,CAACoB,KAAK,CAACC,KAAK,CAACC,aAAa,CAACC,IAAI,CACxD;AACEtC,MAAAA,MAAM,EAAEgC,eAAe;AACvBO,MAAAA,eAAe,EAAEvC,MAAM,CAACwC,gBAAgB,IAAIxC,MAAM,CAACE;KACpD,EACD,YAAYuC,SAAS,CACtB;AACD,IAAA,IAAI,CAAC,IAAI,CAACC,eAAe,CAAC3B,QAAQ,EAAEiB,eAAe,CAAC,IAAI,CAACjB,QAAQ,CAACd,OAAO,EAAE,OAAO,KAAK;AACvFqB,IAAAA,eAAe,CAAC,IAAI,CAACD,GAAG,EAAE;AAAE,MAAA,GAAGN,QAAQ;AAAEf,MAAAA,MAAM,EAAEgC;AAAe,KAAE,CAAC;AACnE,IAAA,OAAO,IAAI;AACb,EAAA;AAEQU,EAAAA,eAAeA,CACrB3B,QAAiB,EACjBf,MAA6B,EAAA;IAE7B,IAAI,CAACe,QAAQ,IAAI,OAAOA,QAAQ,KAAK,QAAQ,EAAE,OAAO,KAAK;IAC3D,MAAMP,KAAK,GAAGO,QAAwC;AACtD,IAAA,IAAI,OAAOP,KAAK,CAACP,OAAO,KAAK,SAAS,IAAIO,KAAK,CAACN,SAAS,KAAKF,MAAM,CAACE,SAAS,EAAE,OAAO,KAAK;AAC5F,IAAA,IAAI,CAAC,IAAI,CAACyC,aAAa,CAACnC,KAAK,CAACR,MAAM,EAAEA,MAAM,CAAC,EAAE,OAAO,KAAK;AAC3D,IAAA,IAAIQ,KAAK,CAACoC,QAAQ,KAAKH,SAAS,IAAI,OAAOjC,KAAK,CAACoC,QAAQ,KAAK,QAAQ,EAAE,OAAO,KAAK;AACpF,IAAA,IAAIpC,KAAK,CAACL,KAAK,KAAKsC,SAAS,IAAI,CAAC,IAAI,CAACI,YAAY,CAACrC,KAAK,CAACL,KAAK,CAAC,EAAE,OAAO,KAAK;AAC9E,IAAA,OAAO,CAACK,KAAK,CAACP,OAAO,IAAI,CAACD,MAAM,CAAC2B,OAAO,CAACvB,SAAS,IAAI,IAAI,CAACyC,YAAY,CAACrC,KAAK,CAACL,KAAK,CAAC;AACtF,EAAA;AAEQwC,EAAAA,aAAaA,CAACnC,KAAc,EAAER,MAA6B,EAAA;IACjE,IAAI,CAACQ,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAO,KAAK;IACrD,MAAMsC,UAAU,GAAGtC,KAAuC;AAC1D,IAAA,OACEsC,UAAU,CAAC5C,SAAS,KAAKF,MAAM,CAACE,SAAS,IACzC4C,UAAU,CAACN,gBAAgB,KAAKxC,MAAM,CAACwC,gBAAgB,IACvDM,UAAU,CAAC3B,sBAAsB,KAAKnB,MAAM,CAACmB,sBAAsB,IACnE2B,UAAU,CAAC9C,MAAM,KAAKA,MAAM,CAACA,MAAM;AAEvC,EAAA;EAEQ6C,YAAYA,CAACrC,KAAc,EAAA;IACjC,OAAOuC,KAAK,CAACC,OAAO,CAACxC,KAAK,CAAC,IAAIA,KAAK,CAACK,MAAM,GAAG,CAAC,IAAIL,KAAK,CAACI,KAAK,CAACK,IAAI,IAAI,IAAI,CAACgC,WAAW,CAAChC,IAAI,CAAC,CAAC;AAChG,EAAA;EAEQgC,WAAWA,CAACzC,KAAc,EAAA;IAChC,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAO,KAAK;IACrD,MAAMS,IAAI,GAAGT,KAIZ;AACD,IAAA,IAAIS,IAAI,CAACb,SAAS,KAAK,KAAK,EAAE,OAAO,IAAI;AACzC,IAAA,IAAIa,IAAI,CAACb,SAAS,KAAK,MAAM,EAAE;AAC7B,MAAA,OAAO,OAAOa,IAAI,CAACiC,OAAO,KAAK,QAAQ,IAAIjC,IAAI,CAACiC,OAAO,CAACrC,MAAM,GAAG,CAAC;AACpE,IAAA;IACA,IAAI,CAAC,IAAI,CAACsC,qBAAqB,CAAClC,IAAI,CAACb,SAAS,CAAC,EAAE,OAAO,KAAK;AAC7D,IAAA,OACE2C,KAAK,CAACC,OAAO,CAAC/B,IAAI,CAACmC,aAAa,CAAC,IACjCnC,IAAI,CAACmC,aAAa,CAACvC,MAAM,GAAG,CAAC,IAC7BI,IAAI,CAACmC,aAAa,CAACxC,KAAK,CAACyC,EAAE,IAAI,OAAOA,EAAE,KAAK,QAAQ,IAAIA,EAAE,CAACxC,MAAM,GAAG,CAAC,CAAC;AAE3E,EAAA;EAEQsC,qBAAqBA,CAC3B3C,KAAc,EAAA;IAEd,OAAO,CAAC,mBAAmB,EAAE,eAAe,EAAE,6BAA6B,CAAC,CAAC8C,QAAQ,CACnF9C,KAAmD,CACpD;AACH,EAAA;;AA5EWgB,SAAS,GAAA+B,UAAA,CAAA,CAJrBC,KAAK,CAAoB;AACxBC,EAAAA,cAAc,EAAE,cAAc;AAC9BC,EAAAA,kBAAkB,EAAE;CACrB,CAAC,EAAAC,QAAA,CAAA;EAAAC,MAAA,EAAA;AAAA,CAAA,CAAA,CACW,EAAApC,SAAS,CA6ErB;;AC1FD,MAAMqC,qBAAqB,GAAGC,yBAAyB,CAAC,aAAa,EAAE,OAAO,CAAC;AAGxE,IAAMC,eAAe,GAArB,MAAMA,eAAgB,SAAQC,QAAQ,CAAA;AAAAC,EAAAA,WAAAA,CAAA,GAAAC,IAAA,EAAA;AAAA,IAAA,KAAA,CAAA,GAAAA,IAAA,CAAA;AAAA,IAAA,IAAA,CACnCC,QAAQ,GAAA,MAAA;AAAA,EAAA;EAEhBrC,SAASA,CAACC,KAAmB,EAAA;AAC3B,IAAA,OAAO,IAAI,CAACqC,UAAU,EAAE,CAACC,GAAG,CAACnD,aAAa,CAACa,KAAK,CAACZ,sBAAsB,EAAEY,KAAK,CAAC/B,MAAM,CAAC,CAAC;AACzF,EAAA;AAEAoE,EAAAA,UAAUA,GAAA;AACR,IAAA,IAAI,CAAC,IAAI,CAACD,QAAQ,EAAE,IAAI,CAACA,QAAQ,GAAG,IAAI,CAACG,aAAa,EAAE;IACxD,OAAO,IAAI,CAACH,QAAQ;AACtB,EAAA;AAEAI,EAAAA,KAAKA,GAAA;IACH,IAAI,CAACJ,QAAQ,GAAG1B,SAAS;AAC3B,EAAA;AAEQ6B,EAAAA,aAAaA,GAAA;AACnB,IAAA,MAAME,OAAO,GAAG,IAAIC,GAAG,EAAiC;AACxD,IAAA,MAAMC,kBAAkB,GAAGC,wBAAwB,CAAC,IAAI,CAACC,GAAG,CAAC;IAC7D,KAAK,MAAMC,MAAM,IAAInE,MAAM,CAACoE,MAAM,CAACJ,kBAAkB,CAAC,EAAE;AACtD,MAAA,KAAK,MAAM3C,KAAK,IAAI8C,MAAM,EAAE;QAC1B,MAAMlD,OAAO,GAAGI,KAAK,CAACA,KAAK,CAACgD,IAAI,GAAGlB,qBAAqB,CAAkC;QAC1F,IAAI,CAAClC,OAAO,EAAE;QACd,MAAMzB,SAAS,GAAGgB,aAAa,CAACa,KAAK,CAACZ,sBAAsB,EAAEY,KAAK,CAAC/B,MAAM,CAAC;AAC3EwE,QAAAA,OAAO,CAACQ,GAAG,CAAC9E,SAAS,EAAE;UACrBA,SAAS;UACTiB,sBAAsB,EAAEY,KAAK,CAACZ,sBAAsB;UACpDnB,MAAM,EAAE+B,KAAK,CAAC/B,MAAM;UACpB+B,KAAK;AACLJ,UAAAA,OAAO,EAAEjB,MAAM,CAACuE,MAAM,CAAC;YAAE,GAAGtD;WAAS;AACtC,SAAA,CAAC;AACJ,MAAA;AACF,IAAA;AACA,IAAA,IAAI,CAACuD,oBAAoB,CAACV,OAAO,EAAEE,kBAAkB,CAAC;AACtD,IAAA,OAAOF,OAAO;AAChB,EAAA;AAEQU,EAAAA,oBAAoBA,CAC1BV,OAAmD,EACnDE,kBAAkD,EAAA;IAElD,KAAK,MAAM5B,UAAU,IAAI0B,OAAO,CAACM,MAAM,EAAE,EAAE;AACzC,MAAA,IAAI,CAAChC,UAAU,CAACnB,OAAO,CAACwD,aAAa,EAAE;MACvC,MAAMN,MAAM,GAAGH,kBAAkB,CAAC5B,UAAU,CAAC3B,sBAAsB,CAAC,IAAI,EAAE;AAC1E,MAAA,MAAMiE,cAAc,GAAG,IAAIX,GAAG,CAACI,MAAM,CAACQ,GAAG,CAACtD,KAAK,IAAI,CAACA,KAAK,CAAC/B,MAAM,EAAE+B,KAAK,CAAC,CAAC,CAAC;AAC1Ee,MAAAA,UAAU,CAACN,gBAAgB,GAAG,IAAI,CAAC8C,uBAAuB,CACxDxC,UAAU,EACV0B,OAAO,EACPY,cAAc,CACf;AACH,IAAA;AACF,EAAA;AAEQE,EAAAA,uBAAuBA,CAC7BxC,UAAiC,EACjC0B,OAAmD,EACnDY,cAAiD,EAAA;IAEjD,MAAMG,IAAI,GAAG,IAAIC,GAAG,CAAS,CAAC1C,UAAU,CAAC5C,SAAS,CAAC,CAAC;IACpD,IAAIuF,OAAO,GAAG3C,UAAU;AACxB,IAAA,OAAO2C,OAAO,CAAC9D,OAAO,CAACwD,aAAa,EAAE;AACpC,MAAA,MAAMnF,MAAM,GAAGyF,OAAO,CAAC9D,OAAO,CAACwD,aAAa;AAC5C,MAAA,IAAInF,MAAM,KAAKyF,OAAO,CAACzF,MAAM,EAAE;QAC7B,MAAM,IAAI0F,KAAK,CAAC,CAAA,4CAAA,EAA+CD,OAAO,CAACvF,SAAS,EAAE,CAAC;AACrF,MAAA;AACA,MAAA,MAAM6B,KAAK,GAAGqD,cAAc,CAACf,GAAG,CAACrE,MAAM,CAAC;MACxC,IAAI,CAAC+B,KAAK,EAAE;QACV,MAAM,IAAI2D,KAAK,CAAC,CAAA,qCAAA,EAAwCD,OAAO,CAACvF,SAAS,CAAA,IAAA,EAAOF,MAAM,CAAA,CAAE,CAAC;AAC3F,MAAA;MACA,MAAM2F,SAAS,GAAGzE,aAAa,CAACuE,OAAO,CAACtE,sBAAsB,EAAEnB,MAAM,CAAC;AACvE,MAAA,IAAIuF,IAAI,CAACK,GAAG,CAACD,SAAS,CAAC,EAAE;QACvB,MAAM,IAAID,KAAK,CAAC,CAAA,0BAAA,EAA6B5C,UAAU,CAAC5C,SAAS,EAAE,CAAC;AACtE,MAAA;AACAqF,MAAAA,IAAI,CAACM,GAAG,CAACF,SAAS,CAAC;AACnB,MAAA,MAAMG,MAAM,GAAGtB,OAAO,CAACH,GAAG,CAACsB,SAAS,CAAC;AACrC,MAAA,IAAI,CAACG,MAAM,EAAE,OAAOH,SAAS;AAC7BF,MAAAA,OAAO,GAAGK,MAAM;AAClB,IAAA;IACA,OAAOL,OAAO,CAACvF,SAAS;AAC1B,EAAA;;AA/EW6D,eAAe,GAAAR,UAAA,CAAA,CAD3BwC,IAAI,EAAE,EAAApC,QAAA,CAAA;EAAAC,MAAA,EAAA;AAAA,CAAA,CAAA,CACM,EAAAG,eAAe,CAgF3B;;AClFM,IAAMiC,aAAa,GAAnB,MAAMA,aAAc,SAAQhC,QAAQ,CAAA;AAAAC,EAAAA,WAAAA,CAAA,GAAAC,IAAA,EAAA;AAAA,IAAA,KAAA,CAAA,GAAAA,IAAA,CAAA;AAAA,IAAA,IAAA,CACjC+B,aAAa,GAAA,MAAA;AAAA,EAAA;EAErB,MAAM/D,cAAcA,GAAA;AAClB,IAAA,OAAO,MAAM,IAAI,CAACgE,YAAY,CAAChE,cAAc,EAAE;AACjD,EAAA;EAEA,MAAMuD,OAAOA,CAACvF,SAAkB,EAAA;AAC9B,IAAA,MAAMF,MAAM,GAAG,IAAI,CAACmG,aAAa,CAACjG,SAAS,CAAC;IAC5C,IAAI,CAACF,MAAM,EAAE,IAAI,CAAC4E,GAAG,CAACwB,KAAK,CAAC,GAAG,CAAC;AAEhC,IAAA,MAAMrF,QAAQ,GAAGK,eAAe,CAAC,IAAI,CAACC,GAAG,CAAC;AAC1C,IAAA,IAAI,CAAC,IAAI,CAACgF,mBAAmB,CAACtF,QAAQ,EAAEf,MAAM,CAAC,EAAE,IAAI,CAAC4E,GAAG,CAACwB,KAAK,CAAC,GAAG,CAAC;AAEpE,IAAA,MAAME,YAAY,GAAGxF,eAAe,CAACC,QAAQ,CAAC;IAC9C,MAAMwF,WAAW,GACfvG,MAAM,CAACA,MAAM,KAAK,QAAQ,GACtB,MAAM,IAAI,CAACwG,kBAAkB,CAACxG,MAAM,EAAEe,QAAQ,EAAEuF,YAAY,CAAC,GAC7D7D,SAAS;IACf,OAAO,IAAI,CAACgE,YAAY,CAACzG,MAAM,EAAEe,QAAQ,EAAEuF,YAAY,EAAEC,WAAW,CAAC;AACvE,EAAA;EAEA,IAAYL,YAAYA,GAAA;AACtB,IAAA,IAAI,CAAC,IAAI,CAACD,aAAa,EAAE;AACvB,MAAA,MAAMS,YAAY,GAAG5C,yBAAyB,CAC5C,IAAI,CAAC3B,KAAK,CAACwE,MAAM,CAACC,OAAO,CAAC3E,SAAS,EACnC,SAAS,CACV;MACD,IAAI,CAACgE,aAAa,GAAG,IAAI,CAACrE,IAAI,CAACiF,QAAQ,CAACH,YAAY,CAAiC;AACvF,IAAA;IACA,OAAO,IAAI,CAACT,aAAa;AAC3B,EAAA;AAEQ,EAAA,MAAMO,kBAAkBA,CAC9BxG,MAA6B,EAC7Be,QAA6B,EAC7BuF,YAAqB,EAAA;AAErB,IAAA,MAAMxB,MAAM,GAAG,MAAM,IAAI,CAACoB,YAAY,CAACK,WAAW,CAACvG,MAAM,EAAEe,QAAQ,CAAC;IACpE,MAAM+F,eAAe,GAAG9G,MAAM,CAAC2B,OAAO,CAAC8B,cAAc,IAAI,cAAc;IACvE,MAAMsD,UAAU,GAAG/G,MAAM,CAAC2B,OAAO,CAAC+B,kBAAkB,IAAI,aAAa;AACrE,IAAA,MAAM6C,WAAW,GAAG;AAClB,MAAA,CAACO,eAAe,GAAGhC,MAAM,CAACkC,YAAY;MACtC,CAACD,UAAU,GAAGjC,MAAM,CAACmC;KACtB;IACD,IAAI,CAAC,IAAI,CAACC,OAAO,CAAClH,MAAM,EAAEe,QAAQ,EAAEuF,YAAY,EAAEC,WAAW,CAAC,EAAE,IAAI,CAAC3B,GAAG,CAACwB,KAAK,CAAC,GAAG,CAAC;AACnF,IAAA,OAAOG,WAAW;AACpB,EAAA;EAEQE,YAAYA,CAClBzG,MAA6B,EAC7Be,QAA6B,EAC7BuF,YAAqB,EACrBC,WAAyE,EAAA;IAEzE,OAAO;MACLvG,MAAM;MACNe,QAAQ;MACRuF,YAAY;MACZC,WAAW,EAAEA,MAAK;AAChB,QAAA,IAAI,CAACA,WAAW,EAAE,IAAI,CAAC3B,GAAG,CAACwB,KAAK,CAAC,GAAG,EAAE,6CAA6C,CAAC;QACpF,OAAO;UAAE,GAAGG;SAAa;MAC3B,CAAC;AACDY,MAAAA,KAAK,EAAGC,WAAiC,IACvC,IAAI,CAACD,KAAK,CAACnH,MAAM,EAAEe,QAAQ,EAAEuF,YAAY,EAAEc,WAAW,CAAC;MACzDC,UAAU,EAAGC,KAAyB,IAAI;AACxC,QAAA,IAAIA,KAAK,KAAK7E,SAAS,IAAI,CAAC,IAAI,CAACyE,OAAO,CAAClH,MAAM,EAAEe,QAAQ,EAAEuF,YAAY,EAAEgB,KAAK,CAAC,EAAE;AAC/E,UAAA,IAAI,CAAC1C,GAAG,CAACwB,KAAK,CAAC,GAAG,CAAC;AACrB,QAAA;MACF,CAAC;MACDmB,YAAY,EAAGC,OAA0B,IAAI;AAC3C,QAAA,KAAK,MAAMF,KAAK,IAAIE,OAAO,EAAE;UAC3B,IAAI,CAAC,IAAI,CAACN,OAAO,CAAClH,MAAM,EAAEe,QAAQ,EAAEuF,YAAY,EAAEgB,KAAK,CAAC,EAAE,IAAI,CAAC1C,GAAG,CAACwB,KAAK,CAAC,GAAG,CAAC;AAC/E,QAAA;MACF,CAAC;MACDqB,oBAAoB,EAAEA,MAAM,IAAI,CAACA,oBAAoB,CAACzH,MAAM,EAAEe,QAAQ,EAAEuF,YAAY;KACrF;AACH,EAAA;AAEQmB,EAAAA,oBAAoBA,CAC1BzH,MAA6B,EAC7Be,QAA6B,EAC7BuF,YAAqB,EAAA;IAErB,MAAMoB,OAAO,GACXpB,YAAY,IAAI,CAACtG,MAAM,CAAC2B,OAAO,CAACvB,SAAS,GACrC;AAAEuH,MAAAA,IAAI,EAAE;AAAc,KAAE,GACxB;AACEA,MAAAA,IAAI,EAAE,KAAc;MACpBC,KAAK,EAAE,CAAC7G,QAAQ,CAACZ,KAAK,IAAI,EAAE,EAAE0H,OAAO,CAAC5G,IAAI,IAAG;AAC3C,QAAA,IAAIA,IAAI,CAACb,SAAS,KAAK,KAAK,EAAE,OAAO,EAAE;AACvC,QAAA,IAAIa,IAAI,CAACb,SAAS,KAAK,MAAM,EAAE;AAC7B,UAAA,OAAO,CACL;AACE0H,YAAAA,KAAK,EAAE9H,MAAM,CAAC2B,OAAO,CAAC+B,kBAAkB,IAAI,aAAa;AACzDoB,YAAAA,MAAM,EAAE,CAAC7D,IAAI,CAACiC,OAAO;AACtB,WAAA,CACF;AACH,QAAA;AACA,QAAA,OAAO,CACL;AACE4E,UAAAA,KAAK,EAAE9H,MAAM,CAAC2B,OAAO,CAAC8B,cAAc,IAAI,cAAc;AACtDqB,UAAAA,MAAM,EAAE,CAAC,GAAG7D,IAAI,CAACmC,aAAa;AAC/B,SAAA,CACF;MACH,CAAC;KACF;IACP,IAAIsE,OAAO,CAACC,IAAI,KAAK,KAAK,IAAID,OAAO,CAACE,KAAK,CAAC/G,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC+D,GAAG,CAACwB,KAAK,CAAC,GAAG,CAAC;IAC7E,OAAO;MAAE9F,GAAG,EAAEN,MAAM,CAACE,SAAS;MAAED,OAAO,EAAEc,QAAQ,CAACd,OAAO;AAAEyH,MAAAA;KAAS;AACtE,EAAA;EAEQP,KAAKA,CACXnH,MAA6B,EAC7Be,QAA6B,EAC7BuF,YAAqB,EACrBc,WAAiC,EAAA;IAEjC,IAAId,YAAY,EAAE,OAAOc,WAAW;IACpC,MAAMW,UAAU,GAAG,IAAI,CAACA,UAAU,CAAC/H,MAAM,EAAEe,QAAQ,CAAC;IACpD,IAAI,CAACgH,UAAU,EAAE,IAAI,CAACnD,GAAG,CAACwB,KAAK,CAAC,GAAG,CAAC;AACpC,IAAA,IAAI,CAACgB,WAAW,EAAE,OAAOW,UAAU;IACnC,OAAO;AAAEC,MAAAA,KAAK,EAAE;AAAEA,QAAAA,KAAK,EAAEZ,WAAW;AAAEa,QAAAA,MAAM,EAAEF;AAAU;KAA2B;AACrF,EAAA;AAEQA,EAAAA,UAAUA,CAChB/H,MAA6B,EAC7Be,QAA6B,EAAA;IAE7B,MAAMmH,UAAU,GAAG,CAACnH,QAAQ,CAACZ,KAAK,IAAI,EAAE,EAAE0H,OAAO,CAAC5G,IAAI,IAAI,IAAI,CAACkH,cAAc,CAACnI,MAAM,EAAEiB,IAAI,CAAC,CAAC;AAC5F,IAAA,IAAI,CAACiH,UAAU,CAACrH,MAAM,EAAE,OAAO4B,SAAS;IACxC,OAAQyF,UAAU,CAACrH,MAAM,KAAK,CAAC,GAAGqH,UAAU,CAAC,CAAC,CAAC,GAAG;AAAEE,MAAAA,IAAI,EAAEF;KAAY;AACxE,EAAA;EAEQhB,OAAOA,CACblH,MAA6B,EAC7Be,QAA6B,EAC7BuF,YAAqB,EACrB+B,GAAW,EAAA;IAEX,MAAMvD,MAAM,GAAGuD,GAA8B;IAC7C,IAAI/B,YAAY,EAAE,OAAO,IAAI;IAC7B,OAAO,CAACvF,QAAQ,CAACZ,KAAK,IAAI,EAAE,EAAEa,IAAI,CAACC,IAAI,IAAG;AACxC,MAAA,IAAIA,IAAI,CAACb,SAAS,KAAK,KAAK,EAAE,OAAO,IAAI;AACzC,MAAA,IAAIa,IAAI,CAACb,SAAS,KAAK,MAAM,EAAE;QAC7B,MAAM0H,KAAK,GAAG9H,MAAM,CAAC2B,OAAO,CAAC+B,kBAAkB,IAAI,aAAa;AAChE,QAAA,OAAO4E,MAAM,CAACxD,MAAM,CAACgD,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK7G,IAAI,CAACiC,OAAO;AACrD,MAAA;MACA,MAAM4E,KAAK,GAAG9H,MAAM,CAAC2B,OAAO,CAAC8B,cAAc,IAAI,cAAc;AAC7D,MAAA,OAAOxC,IAAI,CAACmC,aAAa,CAACE,QAAQ,CAACgF,MAAM,CAACxD,MAAM,CAACgD,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACjE,IAAA,CAAC,CAAC;AACJ,EAAA;EAEQ3B,aAAaA,CAACjG,SAAkB,EAAA;IACtC,MAAMsE,OAAO,GAAG,IAAI,CAAC5C,IAAI,CAACC,WAAW,CAACuC,UAAU,EAAE;IAClD,IAAIlE,SAAS,EAAE,OAAOsE,OAAO,CAACH,GAAG,CAACnE,SAAS,CAAC;AAC5C,IAAA,MAAM6B,KAAK,GAAG,IAAI,CAACV,GAAG,CAACU,KAAK;AAC5B,IAAA,OAAOA,KAAK,GACRyC,OAAO,CAACH,GAAG,CAACnD,aAAa,CAACa,KAAK,CAACZ,sBAAsB,EAAEY,KAAK,CAAC/B,MAAM,CAAC,CAAC,GACtEyC,SAAS;AACf,EAAA;AAEQ4D,EAAAA,mBAAmBA,CACzBtF,QAAyC,EACzCf,MAA6B,EAAA;AAE7B,IAAA,OAAOuI,OAAO,CACZxH,QAAQ,EAAEd,OAAO,IACjBc,QAAQ,CAACb,SAAS,KAAKF,MAAM,CAACE,SAAS,IACvCa,QAAQ,CAACf,MAAM,CAACE,SAAS,KAAKF,MAAM,CAACE,SAAS,IAC9Ca,QAAQ,CAACf,MAAM,CAACwC,gBAAgB,KAAKxC,MAAM,CAACwC,gBAAgB,IAC5DzB,QAAQ,CAACf,MAAM,CAACmB,sBAAsB,KAAKnB,MAAM,CAACmB,sBAAsB,IACxEJ,QAAQ,CAACf,MAAM,CAACA,MAAM,KAAKA,MAAM,CAACA,MAAM,IACxC,IAAI,CAAC6C,YAAY,CAAC9B,QAAQ,CAACZ,KAAK,CAAC,CAClC;AACH,EAAA;EAEQ0C,YAAYA,CAAC1C,KAAmC,EAAA;AACtD,IAAA,IAAI,CAACA,KAAK,EAAEU,MAAM,EAAE,OAAO,KAAK;AAChC,IAAA,OAAOV,KAAK,CAACS,KAAK,CAACK,IAAI,IAAG;AACxB,MAAA,IAAIA,IAAI,CAACb,SAAS,KAAK,KAAK,EAAE,OAAO,IAAI;MACzC,IAAIa,IAAI,CAACb,SAAS,KAAK,MAAM,EAC3B,OAAO,OAAOa,IAAI,CAACiC,OAAO,KAAK,QAAQ,IAAIjC,IAAI,CAACiC,OAAO,CAACrC,MAAM,GAAG,CAAC;MACpE,OACE,CAAC,mBAAmB,EAAE,eAAe,EAAE,6BAA6B,CAAC,CAACyC,QAAQ,CAC5ErC,IAAI,CAACb,SAAS,CACf,IACD2C,KAAK,CAACC,OAAO,CAAC/B,IAAI,CAACmC,aAAa,CAAC,IACjCnC,IAAI,CAACmC,aAAa,CAACvC,MAAM,GAAG,CAAC,IAC7BI,IAAI,CAACmC,aAAa,CAACxC,KAAK,CAACyC,EAAE,IAAI,OAAOA,EAAE,KAAK,QAAQ,IAAIA,EAAE,CAACxC,MAAM,GAAG,CAAC,CAAC;AAE3E,IAAA,CAAC,CAAC;AACJ,EAAA;AAEQsH,EAAAA,cAAcA,CACpBnI,MAA6B,EAC7BiB,IAAoB,EAAA;IAEpB,IAAIA,IAAI,CAACb,SAAS,KAAK,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;AACzC,IAAA,IAAIa,IAAI,CAACb,SAAS,KAAK,MAAM,EAAE;MAC7B,MAAM0H,KAAK,GAAG9H,MAAM,CAAC2B,OAAO,CAAC+B,kBAAkB,IAAI,aAAa;AAChE,MAAA,OAAO,CAAC;QAAE,CAACoE,KAAK,GAAG7G,IAAI,CAACiC;AAAO,OAAE,CAAC;AACpC,IAAA;IACA,MAAM4E,KAAK,GAAG9H,MAAM,CAAC2B,OAAO,CAAC8B,cAAc,IAAI,cAAc;AAC7D,IAAA,OAAO,CAAC;AAAE,MAAA,CAACqE,KAAK,GAAG;QAAEU,IAAI,EAAEvH,IAAI,CAACmC;AAAa;AAAE,KAAE,CAAC;AACpD,EAAA;;AA5MW4C,aAAa,GAAAzC,UAAA,CAAA,CADzBwC,IAAI,EAAE,EAAApC,QAAA,CAAA;EAAAC,MAAA,EAAA;AAAA,CAAA,CAAA,CACM,EAAAoC,aAAa,CA6MzB;;AC5MM,IAAMyC,sBAAsB,GAA5B,MAAMA,sBAAuB,SAAQC,aAG3C,CAAA;AAHYD,sBAAsB,GAAAlF,UAAA,CAAA,CADlCoF,KAAK,EAAE,EAAAhF,QAAA,CAAA;EAAAC,MAAA,EAAA;AAAA,CAAA,CAAA,CACK,EAAA6E,sBAAsB,CAG/B;;ACPG,IAAMG,kBAAkB,GAAxB,MAAMA,kBAAmB,SAAQF,aAGvC,CAAA;AAHYE,kBAAkB,GAAArF,UAAA,CAAA,CAD9BoF,KAAK,EAAE,EAAAhF,QAAA,CAAA;EAAAC,MAAA,EAAA;AAAA,CAAA,CAAA,CACK,EAAAgF,kBAAkB,CAG3B;;ACTE,SAAUjC,MAAMA,CAACkC,IAAqB,EAAA;EAC1C,OAAO;AACLjC,IAAAA,OAAO,EAAE;AACP3E,MAAAA,SAAS,EAAE;AACZ;GACF;AACH;;AC+GO,IAAM6G,gBAAgB,GAAtB,MAAMA,gBAAiB,SAAQC,aAAa,CAAA;AAAtCD,gBAAgB,GAAAvF,UAAA,CAAA,CAD5ByF,KAAK,EAAE,EAAArF,QAAA,CAAA;EAAAC,MAAA,EAAA;AAAA,CAAA,CAAA,CACK,EAAAkF,gBAAgB,CAAyB;AA0BtD;;;;"}
|
|
@@ -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 @@
|
|
|
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,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
|
+
}
|