@spinajs/rbac-http-token 2.0.513 → 2.0.514
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/README.md +62 -6
- package/lib/cjs/actions.d.ts +34 -6
- package/lib/cjs/actions.d.ts.map +1 -1
- package/lib/cjs/actions.js +54 -14
- package/lib/cjs/actions.js.map +1 -1
- package/lib/cjs/cli/CreateToken.js +1 -1
- package/lib/cjs/cli/CreateToken.js.map +1 -1
- package/lib/cjs/cli/GrantTokenRole.js +1 -1
- package/lib/cjs/cli/GrantTokenRole.js.map +1 -1
- package/lib/cjs/config/rbac-http-token.d.ts +17 -0
- package/lib/cjs/config/rbac-http-token.d.ts.map +1 -1
- package/lib/cjs/config/rbac-http-token.js +17 -0
- package/lib/cjs/config/rbac-http-token.js.map +1 -1
- package/lib/cjs/controllers/AccessTokenController.d.ts +18 -5
- package/lib/cjs/controllers/AccessTokenController.d.ts.map +1 -1
- package/lib/cjs/controllers/AccessTokenController.js +28 -5
- package/lib/cjs/controllers/AccessTokenController.js.map +1 -1
- package/lib/cjs/index.d.ts +2 -0
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +2 -0
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces.d.ts +41 -0
- package/lib/cjs/interfaces.d.ts.map +1 -1
- package/lib/cjs/interfaces.js +33 -1
- package/lib/cjs/interfaces.js.map +1 -1
- package/lib/cjs/role-policy.d.ts +28 -0
- package/lib/cjs/role-policy.d.ts.map +1 -0
- package/lib/cjs/role-policy.js +52 -0
- package/lib/cjs/role-policy.js.map +1 -0
- package/lib/mjs/actions.d.ts +34 -6
- package/lib/mjs/actions.d.ts.map +1 -1
- package/lib/mjs/actions.js +54 -15
- package/lib/mjs/actions.js.map +1 -1
- package/lib/mjs/cli/CreateToken.js +1 -1
- package/lib/mjs/cli/CreateToken.js.map +1 -1
- package/lib/mjs/cli/GrantTokenRole.js +1 -1
- package/lib/mjs/cli/GrantTokenRole.js.map +1 -1
- package/lib/mjs/config/rbac-http-token.d.ts +17 -0
- package/lib/mjs/config/rbac-http-token.d.ts.map +1 -1
- package/lib/mjs/config/rbac-http-token.js +17 -0
- package/lib/mjs/config/rbac-http-token.js.map +1 -1
- package/lib/mjs/controllers/AccessTokenController.d.ts +18 -5
- package/lib/mjs/controllers/AccessTokenController.d.ts.map +1 -1
- package/lib/mjs/controllers/AccessTokenController.js +29 -6
- package/lib/mjs/controllers/AccessTokenController.js.map +1 -1
- package/lib/mjs/index.d.ts +2 -0
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +2 -0
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/interfaces.d.ts +41 -0
- package/lib/mjs/interfaces.d.ts.map +1 -1
- package/lib/mjs/interfaces.js +31 -0
- package/lib/mjs/interfaces.js.map +1 -1
- package/lib/mjs/role-policy.d.ts +28 -0
- package/lib/mjs/role-policy.d.ts.map +1 -0
- package/lib/mjs/role-policy.js +48 -0
- package/lib/mjs/role-policy.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +15 -15
|
@@ -16,7 +16,7 @@ import { Permission, Resource, User } from '@spinajs/rbac-http';
|
|
|
16
16
|
import { ErrorCode } from '@spinajs/exceptions';
|
|
17
17
|
import { DateTime } from 'luxon';
|
|
18
18
|
import { AccessToken } from '../models/AccessToken.js';
|
|
19
|
-
import { E_TOKEN_CODES, createToken, deleteToken, grantTokenRole, revokeTokenRole } from '../actions.js';
|
|
19
|
+
import { E_TOKEN_CODES, _allowed_roles, createToken, deleteToken, grantTokenRole, revokeTokenRole } from '../actions.js';
|
|
20
20
|
import { CreateTokenDto } from '../dto/create-token-dto.js';
|
|
21
21
|
import { NoTokenAuthPolicy } from '../policies/NoTokenAuthPolicy.js';
|
|
22
22
|
import { NoImpersonationPolicy } from '../policies/NoImpersonationPolicy.js';
|
|
@@ -57,6 +57,19 @@ import { NoImpersonationPolicy } from '../policies/NoImpersonationPolicy.js';
|
|
|
57
57
|
* @tags AccessTokens
|
|
58
58
|
*/
|
|
59
59
|
let AccessTokenController = class AccessTokenController extends BaseController {
|
|
60
|
+
/**
|
|
61
|
+
* Roles that may be put on a new token
|
|
62
|
+
* Answers from the configured AccessTokenRolePolicy - the same source
|
|
63
|
+
* `POST user/tokens` validates against, so a client can never be offered a
|
|
64
|
+
* role the create call would then refuse.
|
|
65
|
+
* @security cookieAuth
|
|
66
|
+
* @response 200 Roles the caller may put on a token
|
|
67
|
+
* @response 401 Unauthorized - valid session required
|
|
68
|
+
* @response 403 Forbidden - access tokens cannot be used on this route
|
|
69
|
+
*/
|
|
70
|
+
async roles(user) {
|
|
71
|
+
return new Ok({ Roles: await _allowed_roles(user) });
|
|
72
|
+
}
|
|
60
73
|
/**
|
|
61
74
|
* List own access tokens
|
|
62
75
|
* Hashes are never returned - `Token` is `@Hidden()` on the model, so the
|
|
@@ -73,10 +86,11 @@ let AccessTokenController = class AccessTokenController extends BaseController {
|
|
|
73
86
|
/**
|
|
74
87
|
* Create an access token
|
|
75
88
|
* The plaintext appears in this response only and cannot be retrieved again.
|
|
76
|
-
* Roles must be a subset of the
|
|
89
|
+
* Roles must be a subset of what the configured AccessTokenRolePolicy allows
|
|
90
|
+
* the caller - the same set `GET user/tokens/roles` reports.
|
|
77
91
|
* @security cookieAuth
|
|
78
92
|
* @response 200 Token created, `Plaintext` returned once
|
|
79
|
-
* @response 400 Requested roles are not
|
|
93
|
+
* @response 400 Requested roles are not allowed for the caller by the configured role policy
|
|
80
94
|
* @response 401 Unauthorized - valid session required
|
|
81
95
|
* @response 403 Forbidden - access tokens cannot be used on this route
|
|
82
96
|
*/
|
|
@@ -109,13 +123,14 @@ let AccessTokenController = class AccessTokenController extends BaseController {
|
|
|
109
123
|
}
|
|
110
124
|
/**
|
|
111
125
|
* Grant a role to an own token
|
|
112
|
-
* The role must be
|
|
113
|
-
*
|
|
126
|
+
* The role must be allowed for the caller by the configured
|
|
127
|
+
* AccessTokenRolePolicy - a token can never carry more than the policy
|
|
128
|
+
* permits its owner.
|
|
114
129
|
* @security cookieAuth
|
|
115
130
|
* @param uuid Public identifier of the token
|
|
116
131
|
* @param role Role name to grant
|
|
117
132
|
* @response 200 Updated token
|
|
118
|
-
* @response 400 Role is not
|
|
133
|
+
* @response 400 Role is not allowed for the caller by the configured role policy
|
|
119
134
|
* @response 401 Unauthorized - valid session required
|
|
120
135
|
* @response 403 Forbidden - access tokens cannot be used on this route
|
|
121
136
|
* @response 404 No such token for this user
|
|
@@ -206,6 +221,14 @@ let AccessTokenController = class AccessTokenController extends BaseController {
|
|
|
206
221
|
throw err;
|
|
207
222
|
}
|
|
208
223
|
};
|
|
224
|
+
__decorate([
|
|
225
|
+
Get('tokens/roles'),
|
|
226
|
+
Permission(['readOwn']),
|
|
227
|
+
__param(0, User()),
|
|
228
|
+
__metadata("design:type", Function),
|
|
229
|
+
__metadata("design:paramtypes", [UserModel]),
|
|
230
|
+
__metadata("design:returntype", Promise)
|
|
231
|
+
], AccessTokenController.prototype, "roles", null);
|
|
209
232
|
__decorate([
|
|
210
233
|
Get('tokens'),
|
|
211
234
|
Permission(['readOwn']),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessTokenController.js","sourceRoot":"","sources":["../../../src/controllers/AccessTokenController.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACrI,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"AccessTokenController.js","sourceRoot":"","sources":["../../../src/controllers/AccessTokenController.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACrI,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAII,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,cAAc;IACvD;;;;;;;;;OASG;IAGU,AAAN,KAAK,CAAC,KAAK,CAAS,IAAe;QACxC,OAAO,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;;;OAQG;IAGU,AAAN,KAAK,CAAC,IAAI,CAAS,IAAe;QACvC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;;;;;OAUG;IAGU,AAAN,KAAK,CAAC,MAAM,CAAS,IAAe,EAAU,GAAmB;QACtE,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEzE,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACrF,OAAO,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QACvH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IAGU,AAAN,KAAK,CAAC,MAAM,CAAS,IAAe,EAAW,IAAY;QAChE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,IAAI,EAAE,EAAE,CAAC;IAClB,CAAC;IAED;;;;;;;;;;;;;OAaG;IAGU,AAAN,KAAK,CAAC,SAAS,CAAS,IAAe,EAAW,IAAY,EAAW,IAAY;QAC1F,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAClD,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;OAYG;IAGU,AAAN,KAAK,CAAC,UAAU,CAAS,IAAe,EAAW,IAAY,EAAW,IAAY;QAC3F,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACnD,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,GAAG,CAAC,IAAe,EAAE,IAAY;QACzC,OAAO,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACrE,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACO,MAAM,CAAC,KAAkB;QACjC,OAAO,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IACpF,CAAC;IAED;;;;;;;OAOG;IACO,SAAS,CAAC,GAAY;QAC9B,IAAI,GAAG,YAAY,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC,wBAAwB,EAAE,CAAC;YACpF,OAAO,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvG,CAAC;QAED,MAAM,GAAG,CAAC;IACZ,CAAC;CACF,CAAA;AA7Kc;IAFZ,GAAG,CAAC,cAAc,CAAC;IACnB,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC;IACJ,WAAA,IAAI,EAAE,CAAA;;qCAAO,SAAS;;kDAEzC;AAaY;IAFZ,GAAG,CAAC,QAAQ,CAAC;IACb,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC;IACL,WAAA,IAAI,EAAE,CAAA;;qCAAO,SAAS;;iDAGxC;AAeY;IAFZ,IAAI,CAAC,QAAQ,CAAC;IACd,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC;IACL,WAAA,IAAI,EAAE,CAAA;IAAmB,WAAA,IAAI,EAAE,CAAA;;qCAAlB,SAAS,EAAe,cAAc;;mDASvE;AAaY;IAFZ,GAAG,CAAC,cAAc,CAAC;IACnB,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC;IACL,WAAA,IAAI,EAAE,CAAA;IAAmB,WAAA,KAAK,EAAE,CAAA;;qCAAnB,SAAS;;mDAQ1C;AAkBY;IAFZ,GAAG,CAAC,0BAA0B,CAAC;IAC/B,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC;IACF,WAAA,IAAI,EAAE,CAAA;IAAmB,WAAA,KAAK,EAAE,CAAA;IAAgB,WAAA,KAAK,EAAE,CAAA;;qCAA1C,SAAS;;sDAY7C;AAiBY;IAFZ,GAAG,CAAC,0BAA0B,CAAC;IAC/B,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC;IACD,WAAA,IAAI,EAAE,CAAA;IAAmB,WAAA,KAAK,EAAE,CAAA;IAAgB,WAAA,KAAK,EAAE,CAAA;;qCAA1C,SAAS;;uDAY9C;AAvIU,qBAAqB;IAHjC,QAAQ,CAAC,MAAM,CAAC;IAChB,QAAQ,CAAC,aAAa,CAAC;IACvB,MAAM,CAAC,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;GACtC,qBAAqB,CA0LjC"}
|
package/lib/mjs/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import './generator.js';
|
|
2
|
+
import './role-policy.js';
|
|
2
3
|
import './middlewares.js';
|
|
3
4
|
export * from './interfaces.js';
|
|
4
5
|
export * from './models/AccessToken.js';
|
|
5
6
|
export * from './migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.js';
|
|
6
7
|
export * from './generator.js';
|
|
8
|
+
export * from './role-policy.js';
|
|
7
9
|
export * from './events/index.js';
|
|
8
10
|
export * from './actions.js';
|
|
9
11
|
export * from './middlewares.js';
|
package/lib/mjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,CAAC;AAE1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0DAA0D,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,kBAAkB,CAAC;AAE1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0DAA0D,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC"}
|
package/lib/mjs/index.js
CHANGED
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
// generator and the token authorization middleware ) the moment they are
|
|
3
3
|
// loaded, so they must run even if a consumer imports nothing from them.
|
|
4
4
|
import './generator.js';
|
|
5
|
+
import './role-policy.js';
|
|
5
6
|
import './middlewares.js';
|
|
6
7
|
export * from './interfaces.js';
|
|
7
8
|
export * from './models/AccessToken.js';
|
|
8
9
|
export * from './migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.js';
|
|
9
10
|
export * from './generator.js';
|
|
11
|
+
export * from './role-policy.js';
|
|
10
12
|
export * from './events/index.js';
|
|
11
13
|
export * from './actions.js';
|
|
12
14
|
export * from './middlewares.js';
|
package/lib/mjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yEAAyE;AACzE,yEAAyE;AACzE,OAAO,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,CAAC;AAE1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0DAA0D,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yEAAyE;AACzE,yEAAyE;AACzE,OAAO,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,kBAAkB,CAAC;AAE1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0DAA0D,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC"}
|
package/lib/mjs/interfaces.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { User } from '@spinajs/rbac';
|
|
1
2
|
export interface IGeneratedToken {
|
|
2
3
|
/**
|
|
3
4
|
* Full token as handed to the user, e.g. `spt_<base64url>`. Shown exactly once.
|
|
@@ -32,6 +33,46 @@ export interface ITokenAuthInfo {
|
|
|
32
33
|
*/
|
|
33
34
|
Uuid: string;
|
|
34
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Decides which roles a given owner may put on an access token.
|
|
38
|
+
*
|
|
39
|
+
* ONE method, FOUR call sites - `createToken`, `grantTokenRole`,
|
|
40
|
+
* `validateToken`, and the `GET user/tokens/roles` controller route (all
|
|
41
|
+
* through the shared `_allowed_roles` helper in `src/actions.ts`). That is
|
|
42
|
+
* deliberate: creation time and request time have to answer the same
|
|
43
|
+
* question, otherwise a role a user was allowed to pick could be one their
|
|
44
|
+
* token silently loses on the next request.
|
|
45
|
+
*
|
|
46
|
+
* `owner` is NOT hydrated the same way by every call site: `GET
|
|
47
|
+
* user/tokens/roles` and `createToken` (from `POST user/tokens`) are handed
|
|
48
|
+
* `req.storage.User` - the application's `User` subclass, with whatever
|
|
49
|
+
* request-pipeline hydration already ran - while `grantTokenRole` and
|
|
50
|
+
* `validateToken` are handed a base `User` with only `Metadata` populated
|
|
51
|
+
* ( `_owner()` / a direct `User.where(...)` lookup, deliberately unscoped by
|
|
52
|
+
* any application model override - see `_owner()`'s comments in
|
|
53
|
+
* `src/actions.ts` ). A correct implementation MUST NOT rely on anything
|
|
54
|
+
* beyond the base `User` model plus `Metadata` being present on `owner` -
|
|
55
|
+
* that is the only shape all four call sites agree on. Any
|
|
56
|
+
* application-specific field a policy reads may be populated on a
|
|
57
|
+
* session-authenticated call and absent on a token-authenticated one,
|
|
58
|
+
* answering the identical question two different ways.
|
|
59
|
+
*
|
|
60
|
+
* Replaceable via config `rbac.token.rolePolicy.service`, the same pattern
|
|
61
|
+
* `rbac.token.generation.service` uses for the token generator. The shipped
|
|
62
|
+
* default ( `OwnRolesTokenRolePolicy` ) answers with the owner's own roles,
|
|
63
|
+
* which is the behaviour this package had before the seam existed.
|
|
64
|
+
*/
|
|
65
|
+
export declare abstract class AccessTokenRolePolicy {
|
|
66
|
+
/**
|
|
67
|
+
* Roles `owner` may carry on a token. Also the set every one of their
|
|
68
|
+
* existing tokens is re-intersected with on each authenticated request, so a
|
|
69
|
+
* role dropped from this answer stops authorising immediately.
|
|
70
|
+
*
|
|
71
|
+
* @param owner - at minimum a base `User` with `Metadata` populated; see the
|
|
72
|
+
* class docblock above for why nothing more may be assumed.
|
|
73
|
+
*/
|
|
74
|
+
abstract allowedRoles(owner: User): Promise<string[]>;
|
|
75
|
+
}
|
|
35
76
|
declare module '@spinajs/rbac' {
|
|
36
77
|
interface IRbacAsyncStorage {
|
|
37
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAO1C,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,8BAAsB,6BAA6B;IACjD;;OAEG;IACH,SAAgB,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAErD;;OAEG;IACH,SAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,8BAAsB,qBAAqB;IACzC;;;;;;;OAOG;IACH,SAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9D;AAED,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,iBAAiB;QACzB;;WAEG;QACH,SAAS,CAAC,EAAE,cAAc,CAAC;KAC5B;CACF;AAED;;;;;GAKG;AACH,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,0BAA0B;QAClC;;WAEG;QACH,SAAS,CAAC,EAAE,cAAc,CAAC;KAC5B;CACF"}
|
package/lib/mjs/interfaces.js
CHANGED
|
@@ -4,4 +4,35 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export class AccessTokenGenerationProvider {
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Decides which roles a given owner may put on an access token.
|
|
9
|
+
*
|
|
10
|
+
* ONE method, FOUR call sites - `createToken`, `grantTokenRole`,
|
|
11
|
+
* `validateToken`, and the `GET user/tokens/roles` controller route (all
|
|
12
|
+
* through the shared `_allowed_roles` helper in `src/actions.ts`). That is
|
|
13
|
+
* deliberate: creation time and request time have to answer the same
|
|
14
|
+
* question, otherwise a role a user was allowed to pick could be one their
|
|
15
|
+
* token silently loses on the next request.
|
|
16
|
+
*
|
|
17
|
+
* `owner` is NOT hydrated the same way by every call site: `GET
|
|
18
|
+
* user/tokens/roles` and `createToken` (from `POST user/tokens`) are handed
|
|
19
|
+
* `req.storage.User` - the application's `User` subclass, with whatever
|
|
20
|
+
* request-pipeline hydration already ran - while `grantTokenRole` and
|
|
21
|
+
* `validateToken` are handed a base `User` with only `Metadata` populated
|
|
22
|
+
* ( `_owner()` / a direct `User.where(...)` lookup, deliberately unscoped by
|
|
23
|
+
* any application model override - see `_owner()`'s comments in
|
|
24
|
+
* `src/actions.ts` ). A correct implementation MUST NOT rely on anything
|
|
25
|
+
* beyond the base `User` model plus `Metadata` being present on `owner` -
|
|
26
|
+
* that is the only shape all four call sites agree on. Any
|
|
27
|
+
* application-specific field a policy reads may be populated on a
|
|
28
|
+
* session-authenticated call and absent on a token-authenticated one,
|
|
29
|
+
* answering the identical question two different ways.
|
|
30
|
+
*
|
|
31
|
+
* Replaceable via config `rbac.token.rolePolicy.service`, the same pattern
|
|
32
|
+
* `rbac.token.generation.service` uses for the token generator. The shipped
|
|
33
|
+
* default ( `OwnRolesTokenRolePolicy` ) answers with the owner's own roles,
|
|
34
|
+
* which is the behaviour this package had before the seam existed.
|
|
35
|
+
*/
|
|
36
|
+
export class AccessTokenRolePolicy {
|
|
37
|
+
}
|
|
7
38
|
//# sourceMappingURL=interfaces.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,MAAM,OAAgB,6BAA6B;CAUlD"}
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,MAAM,OAAgB,6BAA6B;CAUlD;AAaD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,OAAgB,qBAAqB;CAU1C"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { User } from '@spinajs/rbac';
|
|
2
|
+
import { AccessTokenRolePolicy } from './interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* The behaviour this package shipped before the policy seam: a token may carry
|
|
5
|
+
* only roles its owner literally holds in `users.Role`.
|
|
6
|
+
*
|
|
7
|
+
* Safe by construction and needs no access-control lookup, which is why it
|
|
8
|
+
* stays the default - an application that wants finer scopes opts in by
|
|
9
|
+
* registering its own implementation under `rbac.token.rolePolicy.service`.
|
|
10
|
+
*/
|
|
11
|
+
export declare class OwnRolesTokenRolePolicy extends AccessTokenRolePolicy {
|
|
12
|
+
allowedRoles(owner: User): Promise<string[]>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Whether `role` matches any entry of `patterns`.
|
|
16
|
+
*
|
|
17
|
+
* A pattern is either an exact role name, or a name ending in `.*` which
|
|
18
|
+
* matches that prefix and everything beneath it - `route.*` covers `route.home`
|
|
19
|
+
* and `route.admin.users`, but not `routes.read`: the dot is part of the
|
|
20
|
+
* boundary, so a pattern can never swallow an unrelated role that merely starts
|
|
21
|
+
* with the same letters. No other wildcard syntax, on purpose - a full glob in
|
|
22
|
+
* a security list invites patterns nobody can reason about.
|
|
23
|
+
*
|
|
24
|
+
* @param role - role name to test
|
|
25
|
+
* @param patterns - exclusion patterns, typically from `rbac.token.excludedRoles`
|
|
26
|
+
*/
|
|
27
|
+
export declare function _role_excluded(role: string, patterns: string[]): boolean;
|
|
28
|
+
//# sourceMappingURL=role-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-policy.d.ts","sourceRoot":"","sources":["../../src/role-policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;;;;;GAOG;AACH,qBACa,uBAAwB,SAAQ,qBAAqB;IACnD,YAAY,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAExD;CACF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CASxE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Injectable } from '@spinajs/di';
|
|
8
|
+
import { AccessTokenRolePolicy } from './interfaces.js';
|
|
9
|
+
/**
|
|
10
|
+
* The behaviour this package shipped before the policy seam: a token may carry
|
|
11
|
+
* only roles its owner literally holds in `users.Role`.
|
|
12
|
+
*
|
|
13
|
+
* Safe by construction and needs no access-control lookup, which is why it
|
|
14
|
+
* stays the default - an application that wants finer scopes opts in by
|
|
15
|
+
* registering its own implementation under `rbac.token.rolePolicy.service`.
|
|
16
|
+
*/
|
|
17
|
+
let OwnRolesTokenRolePolicy = class OwnRolesTokenRolePolicy extends AccessTokenRolePolicy {
|
|
18
|
+
async allowedRoles(owner) {
|
|
19
|
+
return [...owner.Role];
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
OwnRolesTokenRolePolicy = __decorate([
|
|
23
|
+
Injectable(AccessTokenRolePolicy)
|
|
24
|
+
], OwnRolesTokenRolePolicy);
|
|
25
|
+
export { OwnRolesTokenRolePolicy };
|
|
26
|
+
/**
|
|
27
|
+
* Whether `role` matches any entry of `patterns`.
|
|
28
|
+
*
|
|
29
|
+
* A pattern is either an exact role name, or a name ending in `.*` which
|
|
30
|
+
* matches that prefix and everything beneath it - `route.*` covers `route.home`
|
|
31
|
+
* and `route.admin.users`, but not `routes.read`: the dot is part of the
|
|
32
|
+
* boundary, so a pattern can never swallow an unrelated role that merely starts
|
|
33
|
+
* with the same letters. No other wildcard syntax, on purpose - a full glob in
|
|
34
|
+
* a security list invites patterns nobody can reason about.
|
|
35
|
+
*
|
|
36
|
+
* @param role - role name to test
|
|
37
|
+
* @param patterns - exclusion patterns, typically from `rbac.token.excludedRoles`
|
|
38
|
+
*/
|
|
39
|
+
export function _role_excluded(role, patterns) {
|
|
40
|
+
return patterns.some((pattern) => {
|
|
41
|
+
if (pattern.endsWith('.*')) {
|
|
42
|
+
const prefix = pattern.slice(0, -1); // keeps the trailing dot
|
|
43
|
+
return role.startsWith(prefix);
|
|
44
|
+
}
|
|
45
|
+
return role === pattern;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=role-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-policy.js","sourceRoot":"","sources":["../../src/role-policy.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;;;;;GAOG;AAEI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,qBAAqB;IACzD,KAAK,CAAC,YAAY,CAAC,KAAW;QACnC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;CACF,CAAA;AAJY,uBAAuB;IADnC,UAAU,CAAC,qBAAqB,CAAC;GACrB,uBAAuB,CAInC;;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,QAAkB;IAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC/B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB;YAC9D,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,KAAK,OAAO,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
|