@spinajs/rbac-http 2.0.468 → 2.0.471
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/lib/cjs/controllers/GrantsController.d.ts +14 -1
- package/lib/cjs/controllers/GrantsController.d.ts.map +1 -1
- package/lib/cjs/controllers/GrantsController.js +13 -1
- package/lib/cjs/controllers/GrantsController.js.map +1 -1
- package/lib/cjs/decorators.d.ts +4 -0
- package/lib/cjs/decorators.d.ts.map +1 -1
- package/lib/cjs/decorators.js +6 -2
- package/lib/cjs/decorators.js.map +1 -1
- package/lib/cjs/interfaces.d.ts +48 -0
- package/lib/cjs/interfaces.d.ts.map +1 -1
- package/lib/cjs/interfaces.js.map +1 -1
- package/lib/cjs/middlewares.d.ts +1 -1
- package/lib/cjs/middlewares.d.ts.map +1 -1
- package/lib/cjs/middlewares.js.map +1 -1
- package/lib/cjs/policies/RbacPolicy.d.ts +2 -2
- package/lib/cjs/policies/RbacPolicy.d.ts.map +1 -1
- package/lib/cjs/policies/RbacPolicy.js +3 -3
- package/lib/cjs/policies/RbacPolicy.js.map +1 -1
- package/lib/cjs/route-args.d.ts +1 -1
- package/lib/mjs/controllers/GrantsController.d.ts +14 -1
- package/lib/mjs/controllers/GrantsController.d.ts.map +1 -1
- package/lib/mjs/controllers/GrantsController.js +13 -1
- package/lib/mjs/controllers/GrantsController.js.map +1 -1
- package/lib/mjs/decorators.d.ts +4 -0
- package/lib/mjs/decorators.d.ts.map +1 -1
- package/lib/mjs/decorators.js +6 -2
- package/lib/mjs/decorators.js.map +1 -1
- package/lib/mjs/interfaces.d.ts +48 -0
- package/lib/mjs/interfaces.d.ts.map +1 -1
- package/lib/mjs/interfaces.js.map +1 -1
- package/lib/mjs/middlewares.d.ts +1 -1
- package/lib/mjs/middlewares.d.ts.map +1 -1
- package/lib/mjs/middlewares.js.map +1 -1
- package/lib/mjs/policies/RbacPolicy.d.ts +2 -2
- package/lib/mjs/policies/RbacPolicy.d.ts.map +1 -1
- package/lib/mjs/policies/RbacPolicy.js +3 -3
- package/lib/mjs/policies/RbacPolicy.js.map +1 -1
- package/lib/mjs/route-args.d.ts +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +10 -10
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
import { BaseController, Ok } from '@spinajs/http';
|
|
2
2
|
import { AccessControl } from '@spinajs/rbac';
|
|
3
|
+
import { IGrantsMap } from '../interfaces.js';
|
|
4
|
+
/**
|
|
5
|
+
* RBAC grants management.
|
|
6
|
+
* Provides access to the current RBAC access-control grants configuration.
|
|
7
|
+
* @tags RBAC
|
|
8
|
+
*/
|
|
3
9
|
export declare class GrantsController extends BaseController {
|
|
4
10
|
protected AC: AccessControl;
|
|
5
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Get RBAC grants
|
|
13
|
+
* Returns the full RBAC grants object defining roles and their permissions across resources.
|
|
14
|
+
* @security cookieAuth
|
|
15
|
+
* @returns {IGrantsMap} RBAC grants map keyed by role name
|
|
16
|
+
* @response 401 Unauthorized — valid session cookie required
|
|
17
|
+
*/
|
|
18
|
+
getGrants(): Ok<IGrantsMap>;
|
|
6
19
|
}
|
|
7
20
|
//# sourceMappingURL=GrantsController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrantsController.d.ts","sourceRoot":"","sources":["../../../src/controllers/GrantsController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,EAAE,EAAU,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"GrantsController.d.ts","sourceRoot":"","sources":["../../../src/controllers/GrantsController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,EAAE,EAAU,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;;GAIG;AACH,qBAEa,gBAAiB,SAAQ,cAAc;IAGhD,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;IAE5B;;;;;;OAMG;IAEI,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC;CAIrC"}
|
|
@@ -14,7 +14,19 @@ const http_1 = require("@spinajs/http");
|
|
|
14
14
|
const rbac_1 = require("@spinajs/rbac");
|
|
15
15
|
const di_1 = require("@spinajs/di");
|
|
16
16
|
const AuthorizedPolicy_js_1 = require("../policies/AuthorizedPolicy.js");
|
|
17
|
+
/**
|
|
18
|
+
* RBAC grants management.
|
|
19
|
+
* Provides access to the current RBAC access-control grants configuration.
|
|
20
|
+
* @tags RBAC
|
|
21
|
+
*/
|
|
17
22
|
let GrantsController = class GrantsController extends http_1.BaseController {
|
|
23
|
+
/**
|
|
24
|
+
* Get RBAC grants
|
|
25
|
+
* Returns the full RBAC grants object defining roles and their permissions across resources.
|
|
26
|
+
* @security cookieAuth
|
|
27
|
+
* @returns {IGrantsMap} RBAC grants map keyed by role name
|
|
28
|
+
* @response 401 Unauthorized — valid session cookie required
|
|
29
|
+
*/
|
|
18
30
|
getGrants() {
|
|
19
31
|
return new http_1.Ok(this.AC.getGrants());
|
|
20
32
|
}
|
|
@@ -28,7 +40,7 @@ __decorate([
|
|
|
28
40
|
(0, http_1.Get)(),
|
|
29
41
|
__metadata("design:type", Function),
|
|
30
42
|
__metadata("design:paramtypes", []),
|
|
31
|
-
__metadata("design:returntype",
|
|
43
|
+
__metadata("design:returntype", http_1.Ok)
|
|
32
44
|
], GrantsController.prototype, "getGrants", null);
|
|
33
45
|
exports.GrantsController = GrantsController = __decorate([
|
|
34
46
|
(0, http_1.BasePath)('grants'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrantsController.js","sourceRoot":"","sources":["../../../src/controllers/GrantsController.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAA0E;AAC1E,wCAA8C;AAC9C,oCAAyC;AACzC,yEAAmE;
|
|
1
|
+
{"version":3,"file":"GrantsController.js","sourceRoot":"","sources":["../../../src/controllers/GrantsController.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAA0E;AAC1E,wCAA8C;AAC9C,oCAAyC;AACzC,yEAAmE;AAGnE;;;;GAIG;AAGI,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,qBAAc;IAKhD;;;;;;OAMG;IAEI,SAAS;QACZ,OAAO,IAAI,SAAE,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;IACvC,CAAC;CAEJ,CAAA;AAjBY,4CAAgB;AAGf;IADT,IAAA,eAAU,EAAC,oBAAa,CAAC;8BACZ,oBAAa;4CAAC;AAUrB;IADN,IAAA,UAAG,GAAE;;;oCACc,SAAE;iDAErB;2BAfQ,gBAAgB;IAF5B,IAAA,eAAQ,EAAC,QAAQ,CAAC;IAClB,IAAA,aAAM,EAAC,sCAAgB,CAAC;GACZ,gBAAgB,CAiB5B"}
|
package/lib/cjs/decorators.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { IRbacDescriptor } from './interfaces.js';
|
|
2
2
|
import { PermissionType } from '@spinajs/rbac';
|
|
3
|
+
/**
|
|
4
|
+
* Global symbol so external packages (e.g. http-swagger) can read the RBAC
|
|
5
|
+
* descriptor via Reflect metadata without importing rbac-http.
|
|
6
|
+
*/
|
|
3
7
|
export declare const ACL_CONTROLLER_DESCRIPTOR: unique symbol;
|
|
4
8
|
export declare function setRbacMetadata(target: any, callback: (meta: IRbacDescriptor) => void): void;
|
|
5
9
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkC,MAAM,iBAAiB,CAAC;AAGlF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,eAAO,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkC,MAAM,iBAAiB,CAAC;AAGlF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,yBAAyB,eAAiD,CAAC;AAExF,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,QAerF;AAqBD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAE,cAAc,EAAgB,OAKpF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,UAAU,GAAE,cAAc,EAAgB,OAapE;AAED;;GAEG;AACH,wBAAgB,IAAI,0GAEnB;AAED;;GAEG;AACH,wBAAgB,WAAW,0GAE1B;AAED,wBAAgB,OAAO,0GAEtB"}
|
package/lib/cjs/decorators.js
CHANGED
|
@@ -9,7 +9,11 @@ exports.FromSession = FromSession;
|
|
|
9
9
|
exports.Session = Session;
|
|
10
10
|
const http_1 = require("@spinajs/http");
|
|
11
11
|
const RbacPolicy_js_1 = require("./policies/RbacPolicy.js");
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Global symbol so external packages (e.g. http-swagger) can read the RBAC
|
|
14
|
+
* descriptor via Reflect metadata without importing rbac-http.
|
|
15
|
+
*/
|
|
16
|
+
exports.ACL_CONTROLLER_DESCRIPTOR = Symbol.for('ACL_CONTROLLER_DESCRIPTOR_SYMBOL');
|
|
13
17
|
function setRbacMetadata(target, callback) {
|
|
14
18
|
let metadata = Reflect.getMetadata(exports.ACL_CONTROLLER_DESCRIPTOR, target.prototype || target);
|
|
15
19
|
if (!metadata) {
|
|
@@ -68,7 +72,7 @@ function Permission(permission = ['readOwn']) {
|
|
|
68
72
|
metadata.Routes.set(propertyKey, route);
|
|
69
73
|
}
|
|
70
74
|
}
|
|
71
|
-
(0, http_1.Policy)(RbacPolicy_js_1.RbacPolicy)(target, propertyKey,
|
|
75
|
+
(0, http_1.Policy)(RbacPolicy_js_1.RbacPolicy)(target, propertyKey, undefined);
|
|
72
76
|
});
|
|
73
77
|
}
|
|
74
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/interfaces.d.ts
CHANGED
|
@@ -1,4 +1,52 @@
|
|
|
1
1
|
import { User, ISession, PermissionType } from '@spinajs/rbac';
|
|
2
|
+
/** Single user metadata key-value entry */
|
|
3
|
+
export interface IUserMetadataEntry {
|
|
4
|
+
Id: number;
|
|
5
|
+
Key: string;
|
|
6
|
+
Value: string;
|
|
7
|
+
Type: 'number' | 'float' | 'string' | 'json' | 'boolean' | 'datetime';
|
|
8
|
+
user_id: number;
|
|
9
|
+
}
|
|
10
|
+
/** User account data serialised by dehydrate() — model fields only, no relations */
|
|
11
|
+
export interface IUserProfile {
|
|
12
|
+
Id: number;
|
|
13
|
+
Uuid: string;
|
|
14
|
+
Email: string;
|
|
15
|
+
Login: string;
|
|
16
|
+
Role: string[];
|
|
17
|
+
CreatedAt: string;
|
|
18
|
+
RegisteredAt: string;
|
|
19
|
+
DeletedAt: string | null;
|
|
20
|
+
LastLoginAt: string | null;
|
|
21
|
+
IsActive: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** User account data serialised by dehydrateWithRelations() — includes optional loaded relations */
|
|
24
|
+
export interface IUserData extends IUserProfile {
|
|
25
|
+
Metadata?: IUserMetadataEntry[];
|
|
26
|
+
}
|
|
27
|
+
/** Flattened RBAC grants for a user: resource → action → permission descriptor */
|
|
28
|
+
export type IGrantsMap = Record<string, Record<string, {
|
|
29
|
+
attributes: string[];
|
|
30
|
+
}>>;
|
|
31
|
+
/** Successful authentication response — user profile merged with RBAC grants */
|
|
32
|
+
export interface IUserWithGrants extends IUserProfile {
|
|
33
|
+
Grants: IGrantsMap;
|
|
34
|
+
}
|
|
35
|
+
/** Login response when TOTP verification step is still pending */
|
|
36
|
+
export interface ITwoFactorAuthRequired {
|
|
37
|
+
TwoFactorAuthRequired: true;
|
|
38
|
+
}
|
|
39
|
+
/** Login response when initial TOTP device setup is required before first use */
|
|
40
|
+
export interface ITwoFactorInitRequired {
|
|
41
|
+
TwoFactorInitRequired: true;
|
|
42
|
+
}
|
|
43
|
+
/** All possible shapes returned by the login endpoint */
|
|
44
|
+
export type ILoginResponse = IUserWithGrants | ITwoFactorAuthRequired | ITwoFactorInitRequired;
|
|
45
|
+
/** Response returned when TOTP is successfully enabled for a user */
|
|
46
|
+
export interface IEnable2faResponse {
|
|
47
|
+
/** OTP provisioning URI — scan with an authenticator app (e.g. Google Authenticator) */
|
|
48
|
+
otp: string;
|
|
49
|
+
}
|
|
2
50
|
declare module '@spinajs/http' {
|
|
3
51
|
interface IActionLocalStoregeContext {
|
|
4
52
|
User: User | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAO/D,2CAA2C;AAC3C,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IACtE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,oGAAoG;AACpG,MAAM,WAAW,SAAU,SAAQ,YAAY;IAC7C,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,kFAAkF;AAClF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CAAC;AAElF,gFAAgF;AAChF,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,kEAAkE;AAClE,MAAM,WAAW,sBAAsB;IACrC,qBAAqB,EAAE,IAAI,CAAC;CAC7B;AAED,iFAAiF;AACjF,MAAM,WAAW,sBAAsB;IACrC,qBAAqB,EAAE,IAAI,CAAC;CAC7B;AAED,yDAAyD;AACzD,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,sBAAsB,GAAG,sBAAsB,CAAC;AAE/F,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,GAAG,EAAE,MAAM,CAAC;CACb;AAGD,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,0BAA0B;QAClC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO,EAAE,QAAQ,CAAC;QAElB;;;;;WAKG;QACH,eAAe,CAAC,EAAG,cAAc,CAAC;KACnC;CACF;AAGD,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,UAAU,EAAE,cAAc,EAAE,CAAC;IAE7B;;OAEG;IACH,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,8BAA8B;IAC7C;;OAEG;IACH,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,8BAAsB,qBAAqB;IACzC;;OAEG;aACa,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAE3D;;;;OAIG;aACa,OAAO,CAAC,IAAI,EAAG,IAAI,GAAI,OAAO,CAAC,IAAI,CAAC;IAEpD;;OAEG;aACa,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAElD;;OAEG;aACa,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAExE;;OAEG;aACa,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAEvD;;;;OAIG;aACa,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAE3D;;;;;OAKG;aACa,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAClE;AAED,8BAAsB,mBAAmB;CAAG;AAE5C,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":";;;AAyGA,MAAsB,qBAAqB;CA0C1C;AA1CD,sDA0CC;AAED,MAAsB,mBAAmB;CAAG;AAA5C,kDAA4C"}
|
package/lib/cjs/middlewares.d.ts
CHANGED
|
@@ -7,6 +7,6 @@ export declare class RbacMiddleware extends ServerMiddleware {
|
|
|
7
7
|
protected SessionProvider: SessionProvider;
|
|
8
8
|
resolve(): Promise<void>;
|
|
9
9
|
before(): (req: sRequest, res: express.Response, next: express.NextFunction) => void;
|
|
10
|
-
after(): (req: sRequest, res: express.Response, next: express.NextFunction) => void;
|
|
10
|
+
after(): ((req: sRequest, res: express.Response, next: express.NextFunction) => void) | null;
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=middlewares.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../src/middlewares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,eAAe,EAAQ,MAAM,eAAe,CAAC;AAEhE,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtE,qBACa,cAAe,SAAQ,gBAAgB;IAElD,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAGhC,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAE9B,OAAO;IAMb,MAAM,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI;IA4BpF,KAAK,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI;
|
|
1
|
+
{"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../src/middlewares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,eAAe,EAAQ,MAAM,eAAe,CAAC;AAEhE,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtE,qBACa,cAAe,SAAQ,gBAAgB;IAElD,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAGhC,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAE9B,OAAO;IAMb,MAAM,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI;IA4BpF,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI;CAGpG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewares.js","sourceRoot":"","sources":["../../src/middlewares.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wCAAgE;AAChE,oCAAyD;AACzD,4BAA0B;AAE1B,0DAAgD;AAChD,qDAAuC;AACvC,wCAAsE;AAG/D,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,uBAAgB;IAO3C,KAAK,CAAC,OAAO;QAClB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;QACpI,CAAC;IACH,CAAC;IAEM,MAAM;QACX,OAAO,KAAK,EAAE,GAAa,EAAE,IAAsB,EAAE,IAA0B,EAAE,EAAE;YACjF,IAAI,CAAC;gBACH,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"middlewares.js","sourceRoot":"","sources":["../../src/middlewares.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wCAAgE;AAChE,oCAAyD;AACzD,4BAA0B;AAE1B,0DAAgD;AAChD,qDAAuC;AACvC,wCAAsE;AAG/D,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,uBAAgB;IAO3C,KAAK,CAAC,OAAO;QAClB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;QACpI,CAAC;IACH,CAAC;IAEM,MAAM;QACX,OAAO,KAAK,EAAE,GAAa,EAAE,IAAsB,EAAE,IAA0B,EAAE,EAAE;YACjF,IAAI,CAAC;gBACH,IAAI,OAAO,GAAoB,IAAI,CAAC;gBACpC,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAmB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC7E,IAAI,IAAI,EAAE,CAAC;wBACT,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACZ;;;uBAGG;oBACH,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,MAAM,OAAE,CAAC,OAAO,CAAO,iBAAiB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACzF,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,OAAE,CAAC,OAAO,CAAO,sBAAsB,CAAC,CAAC;gBAC9D,CAAC;gBAED,IAAI,EAAE,CAAC;YACT,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IACM,KAAK;QACV,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA5CY,wCAAc;AAEf;IADT,IAAA,sBAAM,EAAC,oBAAoB,CAAC;;qDACG;AAGtB;IADT,IAAA,eAAU,GAAE;8BACc,sBAAe;uDAAC;yBALhC,cAAc;IAD1B,IAAA,eAAU,EAAC,uBAAgB,CAAC;GAChB,cAAc,CA4C1B"}
|
|
@@ -11,6 +11,6 @@ export declare class RbacPolicy extends BasePolicy {
|
|
|
11
11
|
execute(req: sRequest, action: IRoute, instance: IController): Promise<void>;
|
|
12
12
|
}
|
|
13
13
|
export declare function checkRbacPermission(role: string | string[], resource: string, permission: string): Permission;
|
|
14
|
-
export declare function checkUserPermission(user: User, resource: string, permission: string): Permission;
|
|
15
|
-
export declare function checkRoutePermission(req: sRequest, resource: string, permission: string): Permission;
|
|
14
|
+
export declare function checkUserPermission(user: User, resource: string, permission: string): Permission | null;
|
|
15
|
+
export declare function checkRoutePermission(req: sRequest, resource: string, permission: string): Permission | null;
|
|
16
16
|
//# sourceMappingURL=RbacPolicy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RbacPolicy.d.ts","sourceRoot":"","sources":["../../../src/policies/RbacPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAe,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AAKlG,OAAO,EAAkB,IAAI,EAAE,MAAM,eAAe,CAAC;AAErD;;GAEG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;;IAQrB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,OAAO;IAKrD,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW;CAyB1E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,CAG7G;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"RbacPolicy.d.ts","sourceRoot":"","sources":["../../../src/policies/RbacPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAe,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AAKlG,OAAO,EAAkB,IAAI,EAAE,MAAM,eAAe,CAAC;AAErD;;GAEG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;;IAQrB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,OAAO;IAKrD,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW;CAyB1E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,CAG7G;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAQvG;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAM3G"}
|
|
@@ -23,12 +23,12 @@ class RbacPolicy extends http_1.BasePolicy {
|
|
|
23
23
|
async execute(req, action, instance) {
|
|
24
24
|
const descriptor = Reflect.getMetadata(decorators_js_1.ACL_CONTROLLER_DESCRIPTOR, instance);
|
|
25
25
|
let permission = descriptor.Permission ?? [];
|
|
26
|
-
if (descriptor.Routes.has(action.Method)) {
|
|
26
|
+
if (descriptor.Routes.has(String(action.Method))) {
|
|
27
27
|
//req.storage.PermissionScope = descriptor.Routes.get(action.Method).Permission;
|
|
28
28
|
if (req.headers['x-permission-scope']) {
|
|
29
29
|
req.storage.PermissionScope = req.headers['x-permission-scope'] ?? null;
|
|
30
30
|
}
|
|
31
|
-
permission = descriptor.Routes.get(action.Method).Permission ?? [];
|
|
31
|
+
permission = descriptor.Routes.get(String(action.Method)).Permission ?? [];
|
|
32
32
|
}
|
|
33
33
|
// check if route has its own permission
|
|
34
34
|
if (!descriptor || !descriptor.Permission || descriptor.Permission.length === 0) {
|
|
@@ -37,7 +37,7 @@ class RbacPolicy extends http_1.BasePolicy {
|
|
|
37
37
|
if (!req.storage || !req.storage.Session || !req.storage.User || !req.storage.Session.Data.get('Authorized')) {
|
|
38
38
|
throw new exceptions_1.AuthenticationFailed('user not logged or session expired');
|
|
39
39
|
}
|
|
40
|
-
if (!permission.some(p => checkRoutePermission(req, descriptor.Resource, p)
|
|
40
|
+
if (!permission.some(p => checkRoutePermission(req, descriptor.Resource, p)?.granted)) {
|
|
41
41
|
throw new exceptions_1.Forbidden(`role(s) ${req.storage.User.Role} does not have permission ${permission} for resource ${descriptor.Resource}`);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RbacPolicy.js","sourceRoot":"","sources":["../../../src/policies/RbacPolicy.ts"],"names":[],"mappings":";;;AAoDA,kDAGC;AAED,kDAQC;AAED,oDAMC;AAxED,wCAAkG;AAClG,oDAAsE;AACtE,oDAA6D;AAE7D,oCAAiC;AAGjC;;GAEG;AACH,MAAa,UAAW,SAAQ,iBAAU;IAGxC;QACE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,EAAE,GAAG,OAAE,CAAC,GAAG,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"RbacPolicy.js","sourceRoot":"","sources":["../../../src/policies/RbacPolicy.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/route-args.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare class UserArg extends RouteArgs {
|
|
|
4
4
|
get SupportedType(): ParameterType;
|
|
5
5
|
extract(callData: IRouteCall, _args: unknown[], _param: IRouteParameter, req: Request): Promise<{
|
|
6
6
|
CallData: IRouteCall;
|
|
7
|
-
Args: import("@spinajs/rbac").User;
|
|
7
|
+
Args: import("@spinajs/rbac").User | null;
|
|
8
8
|
}>;
|
|
9
9
|
}
|
|
10
10
|
export declare class SessionArg extends RouteArgs {
|
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
import { BaseController, Ok } from '@spinajs/http';
|
|
2
2
|
import { AccessControl } from '@spinajs/rbac';
|
|
3
|
+
import { IGrantsMap } from '../interfaces.js';
|
|
4
|
+
/**
|
|
5
|
+
* RBAC grants management.
|
|
6
|
+
* Provides access to the current RBAC access-control grants configuration.
|
|
7
|
+
* @tags RBAC
|
|
8
|
+
*/
|
|
3
9
|
export declare class GrantsController extends BaseController {
|
|
4
10
|
protected AC: AccessControl;
|
|
5
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Get RBAC grants
|
|
13
|
+
* Returns the full RBAC grants object defining roles and their permissions across resources.
|
|
14
|
+
* @security cookieAuth
|
|
15
|
+
* @returns {IGrantsMap} RBAC grants map keyed by role name
|
|
16
|
+
* @response 401 Unauthorized — valid session cookie required
|
|
17
|
+
*/
|
|
18
|
+
getGrants(): Ok<IGrantsMap>;
|
|
6
19
|
}
|
|
7
20
|
//# sourceMappingURL=GrantsController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrantsController.d.ts","sourceRoot":"","sources":["../../../src/controllers/GrantsController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,EAAE,EAAU,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"GrantsController.d.ts","sourceRoot":"","sources":["../../../src/controllers/GrantsController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,EAAE,EAAU,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;;GAIG;AACH,qBAEa,gBAAiB,SAAQ,cAAc;IAGhD,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;IAE5B;;;;;;OAMG;IAEI,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC;CAIrC"}
|
|
@@ -11,7 +11,19 @@ import { BaseController, BasePath, Get, Ok, Policy } from '@spinajs/http';
|
|
|
11
11
|
import { AccessControl } from '@spinajs/rbac';
|
|
12
12
|
import { Autoinject } from '@spinajs/di';
|
|
13
13
|
import { AuthorizedPolicy } from '../policies/AuthorizedPolicy.js';
|
|
14
|
+
/**
|
|
15
|
+
* RBAC grants management.
|
|
16
|
+
* Provides access to the current RBAC access-control grants configuration.
|
|
17
|
+
* @tags RBAC
|
|
18
|
+
*/
|
|
14
19
|
let GrantsController = class GrantsController extends BaseController {
|
|
20
|
+
/**
|
|
21
|
+
* Get RBAC grants
|
|
22
|
+
* Returns the full RBAC grants object defining roles and their permissions across resources.
|
|
23
|
+
* @security cookieAuth
|
|
24
|
+
* @returns {IGrantsMap} RBAC grants map keyed by role name
|
|
25
|
+
* @response 401 Unauthorized — valid session cookie required
|
|
26
|
+
*/
|
|
15
27
|
getGrants() {
|
|
16
28
|
return new Ok(this.AC.getGrants());
|
|
17
29
|
}
|
|
@@ -24,7 +36,7 @@ __decorate([
|
|
|
24
36
|
Get(),
|
|
25
37
|
__metadata("design:type", Function),
|
|
26
38
|
__metadata("design:paramtypes", []),
|
|
27
|
-
__metadata("design:returntype",
|
|
39
|
+
__metadata("design:returntype", Ok)
|
|
28
40
|
], GrantsController.prototype, "getGrants", null);
|
|
29
41
|
GrantsController = __decorate([
|
|
30
42
|
BasePath('grants'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrantsController.js","sourceRoot":"","sources":["../../../src/controllers/GrantsController.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"GrantsController.js","sourceRoot":"","sources":["../../../src/controllers/GrantsController.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE;;;;GAIG;AAGI,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,cAAc;IAKhD;;;;;;OAMG;IAEI,SAAS;QACZ,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;IACvC,CAAC;CAEJ,CAAA;AAda;IADT,UAAU,CAAC,aAAa,CAAC;8BACZ,aAAa;4CAAC;AAUrB;IADN,GAAG,EAAE;;;oCACc,EAAE;iDAErB;AAfQ,gBAAgB;IAF5B,QAAQ,CAAC,QAAQ,CAAC;IAClB,MAAM,CAAC,gBAAgB,CAAC;GACZ,gBAAgB,CAiB5B"}
|
package/lib/mjs/decorators.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { IRbacDescriptor } from './interfaces.js';
|
|
2
2
|
import { PermissionType } from '@spinajs/rbac';
|
|
3
|
+
/**
|
|
4
|
+
* Global symbol so external packages (e.g. http-swagger) can read the RBAC
|
|
5
|
+
* descriptor via Reflect metadata without importing rbac-http.
|
|
6
|
+
*/
|
|
3
7
|
export declare const ACL_CONTROLLER_DESCRIPTOR: unique symbol;
|
|
4
8
|
export declare function setRbacMetadata(target: any, callback: (meta: IRbacDescriptor) => void): void;
|
|
5
9
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkC,MAAM,iBAAiB,CAAC;AAGlF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,eAAO,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkC,MAAM,iBAAiB,CAAC;AAGlF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,yBAAyB,eAAiD,CAAC;AAExF,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,QAerF;AAqBD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAE,cAAc,EAAgB,OAKpF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,UAAU,GAAE,cAAc,EAAgB,OAapE;AAED;;GAEG;AACH,wBAAgB,IAAI,0GAEnB;AAED;;GAEG;AACH,wBAAgB,WAAW,0GAE1B;AAED,wBAAgB,OAAO,0GAEtB"}
|
package/lib/mjs/decorators.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { Parameter, Policy, Route } from '@spinajs/http';
|
|
2
2
|
import { RbacPolicy } from './policies/RbacPolicy.js';
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Global symbol so external packages (e.g. http-swagger) can read the RBAC
|
|
5
|
+
* descriptor via Reflect metadata without importing rbac-http.
|
|
6
|
+
*/
|
|
7
|
+
export const ACL_CONTROLLER_DESCRIPTOR = Symbol.for('ACL_CONTROLLER_DESCRIPTOR_SYMBOL');
|
|
4
8
|
export function setRbacMetadata(target, callback) {
|
|
5
9
|
let metadata = Reflect.getMetadata(ACL_CONTROLLER_DESCRIPTOR, target.prototype || target);
|
|
6
10
|
if (!metadata) {
|
|
@@ -59,7 +63,7 @@ export function Permission(permission = ['readOwn']) {
|
|
|
59
63
|
metadata.Routes.set(propertyKey, route);
|
|
60
64
|
}
|
|
61
65
|
}
|
|
62
|
-
Policy(RbacPolicy)(target, propertyKey,
|
|
66
|
+
Policy(RbacPolicy)(target, propertyKey, undefined);
|
|
63
67
|
});
|
|
64
68
|
}
|
|
65
69
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGtD,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,kCAAkC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"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"}
|
package/lib/mjs/interfaces.d.ts
CHANGED
|
@@ -1,4 +1,52 @@
|
|
|
1
1
|
import { User, ISession, PermissionType } from '@spinajs/rbac';
|
|
2
|
+
/** Single user metadata key-value entry */
|
|
3
|
+
export interface IUserMetadataEntry {
|
|
4
|
+
Id: number;
|
|
5
|
+
Key: string;
|
|
6
|
+
Value: string;
|
|
7
|
+
Type: 'number' | 'float' | 'string' | 'json' | 'boolean' | 'datetime';
|
|
8
|
+
user_id: number;
|
|
9
|
+
}
|
|
10
|
+
/** User account data serialised by dehydrate() — model fields only, no relations */
|
|
11
|
+
export interface IUserProfile {
|
|
12
|
+
Id: number;
|
|
13
|
+
Uuid: string;
|
|
14
|
+
Email: string;
|
|
15
|
+
Login: string;
|
|
16
|
+
Role: string[];
|
|
17
|
+
CreatedAt: string;
|
|
18
|
+
RegisteredAt: string;
|
|
19
|
+
DeletedAt: string | null;
|
|
20
|
+
LastLoginAt: string | null;
|
|
21
|
+
IsActive: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** User account data serialised by dehydrateWithRelations() — includes optional loaded relations */
|
|
24
|
+
export interface IUserData extends IUserProfile {
|
|
25
|
+
Metadata?: IUserMetadataEntry[];
|
|
26
|
+
}
|
|
27
|
+
/** Flattened RBAC grants for a user: resource → action → permission descriptor */
|
|
28
|
+
export type IGrantsMap = Record<string, Record<string, {
|
|
29
|
+
attributes: string[];
|
|
30
|
+
}>>;
|
|
31
|
+
/** Successful authentication response — user profile merged with RBAC grants */
|
|
32
|
+
export interface IUserWithGrants extends IUserProfile {
|
|
33
|
+
Grants: IGrantsMap;
|
|
34
|
+
}
|
|
35
|
+
/** Login response when TOTP verification step is still pending */
|
|
36
|
+
export interface ITwoFactorAuthRequired {
|
|
37
|
+
TwoFactorAuthRequired: true;
|
|
38
|
+
}
|
|
39
|
+
/** Login response when initial TOTP device setup is required before first use */
|
|
40
|
+
export interface ITwoFactorInitRequired {
|
|
41
|
+
TwoFactorInitRequired: true;
|
|
42
|
+
}
|
|
43
|
+
/** All possible shapes returned by the login endpoint */
|
|
44
|
+
export type ILoginResponse = IUserWithGrants | ITwoFactorAuthRequired | ITwoFactorInitRequired;
|
|
45
|
+
/** Response returned when TOTP is successfully enabled for a user */
|
|
46
|
+
export interface IEnable2faResponse {
|
|
47
|
+
/** OTP provisioning URI — scan with an authenticator app (e.g. Google Authenticator) */
|
|
48
|
+
otp: string;
|
|
49
|
+
}
|
|
2
50
|
declare module '@spinajs/http' {
|
|
3
51
|
interface IActionLocalStoregeContext {
|
|
4
52
|
User: User | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAyGA,MAAM,OAAgB,qBAAqB;CA0C1C;AAED,MAAM,OAAgB,mBAAmB;CAAG"}
|
package/lib/mjs/middlewares.d.ts
CHANGED
|
@@ -7,6 +7,6 @@ export declare class RbacMiddleware extends ServerMiddleware {
|
|
|
7
7
|
protected SessionProvider: SessionProvider;
|
|
8
8
|
resolve(): Promise<void>;
|
|
9
9
|
before(): (req: sRequest, res: express.Response, next: express.NextFunction) => void;
|
|
10
|
-
after(): (req: sRequest, res: express.Response, next: express.NextFunction) => void;
|
|
10
|
+
after(): ((req: sRequest, res: express.Response, next: express.NextFunction) => void) | null;
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=middlewares.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../src/middlewares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,eAAe,EAAQ,MAAM,eAAe,CAAC;AAEhE,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtE,qBACa,cAAe,SAAQ,gBAAgB;IAElD,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAGhC,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAE9B,OAAO;IAMb,MAAM,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI;IA4BpF,KAAK,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI;
|
|
1
|
+
{"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../src/middlewares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,eAAe,EAAQ,MAAM,eAAe,CAAC;AAEhE,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtE,qBACa,cAAe,SAAQ,gBAAgB;IAElD,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAGhC,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAE9B,OAAO;IAMb,MAAM,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI;IA4BpF,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI;CAGpG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewares.js","sourceRoot":"","sources":["../../src/middlewares.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAY,eAAe,EAAQ,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAuB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG/D,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,gBAAgB;IAO3C,KAAK,CAAC,OAAO;QAClB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;QACpI,CAAC;IACH,CAAC;IAEM,MAAM;QACX,OAAO,KAAK,EAAE,GAAa,EAAE,IAAsB,EAAE,IAA0B,EAAE,EAAE;YACjF,IAAI,CAAC;gBACH,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"middlewares.js","sourceRoot":"","sources":["../../src/middlewares.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAY,eAAe,EAAQ,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAuB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG/D,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,gBAAgB;IAO3C,KAAK,CAAC,OAAO;QAClB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;QACpI,CAAC;IACH,CAAC;IAEM,MAAM;QACX,OAAO,KAAK,EAAE,GAAa,EAAE,IAAsB,EAAE,IAA0B,EAAE,EAAE;YACjF,IAAI,CAAC;gBACH,IAAI,OAAO,GAAoB,IAAI,CAAC;gBACpC,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAmB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC7E,IAAI,IAAI,EAAE,CAAC;wBACT,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACZ;;;uBAGG;oBACH,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAO,iBAAiB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACzF,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,OAAO,CAAO,sBAAsB,CAAC,CAAC;gBAC9D,CAAC;gBAED,IAAI,EAAE,CAAC;YACT,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IACM,KAAK;QACV,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA1CW;IADT,MAAM,CAAC,oBAAoB,CAAC;;qDACG;AAGtB;IADT,UAAU,EAAE;8BACc,eAAe;uDAAC;AALhC,cAAc;IAD1B,UAAU,CAAC,gBAAgB,CAAC;GAChB,cAAc,CA4C1B"}
|
|
@@ -11,6 +11,6 @@ export declare class RbacPolicy extends BasePolicy {
|
|
|
11
11
|
execute(req: sRequest, action: IRoute, instance: IController): Promise<void>;
|
|
12
12
|
}
|
|
13
13
|
export declare function checkRbacPermission(role: string | string[], resource: string, permission: string): Permission;
|
|
14
|
-
export declare function checkUserPermission(user: User, resource: string, permission: string): Permission;
|
|
15
|
-
export declare function checkRoutePermission(req: sRequest, resource: string, permission: string): Permission;
|
|
14
|
+
export declare function checkUserPermission(user: User, resource: string, permission: string): Permission | null;
|
|
15
|
+
export declare function checkRoutePermission(req: sRequest, resource: string, permission: string): Permission | null;
|
|
16
16
|
//# sourceMappingURL=RbacPolicy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RbacPolicy.d.ts","sourceRoot":"","sources":["../../../src/policies/RbacPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAe,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AAKlG,OAAO,EAAkB,IAAI,EAAE,MAAM,eAAe,CAAC;AAErD;;GAEG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;;IAQrB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,OAAO;IAKrD,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW;CAyB1E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,CAG7G;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"RbacPolicy.d.ts","sourceRoot":"","sources":["../../../src/policies/RbacPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAe,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AAKlG,OAAO,EAAkB,IAAI,EAAE,MAAM,eAAe,CAAC;AAErD;;GAEG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;;IAQrB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,OAAO;IAKrD,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW;CAyB1E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,CAG7G;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAQvG;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAM3G"}
|
|
@@ -17,12 +17,12 @@ export class RbacPolicy extends BasePolicy {
|
|
|
17
17
|
async execute(req, action, instance) {
|
|
18
18
|
const descriptor = Reflect.getMetadata(ACL_CONTROLLER_DESCRIPTOR, instance);
|
|
19
19
|
let permission = descriptor.Permission ?? [];
|
|
20
|
-
if (descriptor.Routes.has(action.Method)) {
|
|
20
|
+
if (descriptor.Routes.has(String(action.Method))) {
|
|
21
21
|
//req.storage.PermissionScope = descriptor.Routes.get(action.Method).Permission;
|
|
22
22
|
if (req.headers['x-permission-scope']) {
|
|
23
23
|
req.storage.PermissionScope = req.headers['x-permission-scope'] ?? null;
|
|
24
24
|
}
|
|
25
|
-
permission = descriptor.Routes.get(action.Method).Permission ?? [];
|
|
25
|
+
permission = descriptor.Routes.get(String(action.Method)).Permission ?? [];
|
|
26
26
|
}
|
|
27
27
|
// check if route has its own permission
|
|
28
28
|
if (!descriptor || !descriptor.Permission || descriptor.Permission.length === 0) {
|
|
@@ -31,7 +31,7 @@ export class RbacPolicy extends BasePolicy {
|
|
|
31
31
|
if (!req.storage || !req.storage.Session || !req.storage.User || !req.storage.Session.Data.get('Authorized')) {
|
|
32
32
|
throw new AuthenticationFailed('user not logged or session expired');
|
|
33
33
|
}
|
|
34
|
-
if (!permission.some(p => checkRoutePermission(req, descriptor.Resource, p)
|
|
34
|
+
if (!permission.some(p => checkRoutePermission(req, descriptor.Resource, p)?.granted)) {
|
|
35
35
|
throw new Forbidden(`role(s) ${req.storage.User.Role} does not have permission ${permission} for resource ${descriptor.Resource}`);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RbacPolicy.js","sourceRoot":"","sources":["../../../src/policies/RbacPolicy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAuB,WAAW,EAAuB,MAAM,eAAe,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjC;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,UAAU;IAGxC;QACE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"RbacPolicy.js","sourceRoot":"","sources":["../../../src/policies/RbacPolicy.ts"],"names":[],"mappings":"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"}
|
package/lib/mjs/route-args.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare class UserArg extends RouteArgs {
|
|
|
4
4
|
get SupportedType(): ParameterType;
|
|
5
5
|
extract(callData: IRouteCall, _args: unknown[], _param: IRouteParameter, req: Request): Promise<{
|
|
6
6
|
CallData: IRouteCall;
|
|
7
|
-
Args: import("@spinajs/rbac").User;
|
|
7
|
+
Args: import("@spinajs/rbac").User | null;
|
|
8
8
|
}>;
|
|
9
9
|
}
|
|
10
10
|
export declare class SessionArg extends RouteArgs {
|