@spinajs/rbac-http 1.2.125 → 1.2.136
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/decorators.d.ts +2 -1
- package/lib/decorators.js +18 -3
- package/lib/decorators.js.map +1 -1
- package/lib/http/src/interfaces.d.ts +443 -0
- package/lib/http/src/interfaces.js +222 -0
- package/lib/http/src/interfaces.js.map +1 -0
- package/lib/interfaces.d.ts +3 -3
- package/lib/policies.d.ts +6 -2
- package/lib/policies.js +24 -4
- package/lib/policies.js.map +1 -1
- package/lib/rbac-http/src/augumentation.d.ts +7 -0
- package/lib/rbac-http/src/augumentation.js +4 -0
- package/lib/rbac-http/src/augumentation.js.map +1 -0
- package/lib/rbac-http/src/config/rbac-http.d.ts +1 -0
- package/lib/rbac-http/src/config/rbac-http.js +21 -0
- package/lib/rbac-http/src/config/rbac-http.js.map +1 -0
- package/lib/rbac-http/src/controllers/LoginController.d.ts +12 -0
- package/lib/rbac-http/src/controllers/LoginController.js +91 -0
- package/lib/rbac-http/src/controllers/LoginController.js.map +1 -0
- package/lib/rbac-http/src/controllers/UsersController.d.ts +17 -0
- package/lib/rbac-http/src/controllers/UsersController.js +199 -0
- package/lib/rbac-http/src/controllers/UsersController.js.map +1 -0
- package/lib/rbac-http/src/decorators.d.ts +18 -0
- package/lib/rbac-http/src/decorators.js +80 -0
- package/lib/rbac-http/src/decorators.js.map +1 -0
- package/lib/rbac-http/src/dto/login-dto.d.ts +20 -0
- package/lib/rbac-http/src/dto/login-dto.js +27 -0
- package/lib/rbac-http/src/dto/login-dto.js.map +1 -0
- package/lib/rbac-http/src/dto/password-dto.d.ts +22 -0
- package/lib/rbac-http/src/dto/password-dto.js +27 -0
- package/lib/rbac-http/src/dto/password-dto.js.map +1 -0
- package/lib/rbac-http/src/dto/user-dto.d.ts +42 -0
- package/lib/rbac-http/src/dto/user-dto.js +31 -0
- package/lib/rbac-http/src/dto/user-dto.js.map +1 -0
- package/lib/rbac-http/src/index.d.ts +8 -0
- package/lib/rbac-http/src/index.js +25 -0
- package/lib/rbac-http/src/index.js.map +1 -0
- package/lib/rbac-http/src/interfaces.d.ts +23 -0
- package/lib/rbac-http/src/interfaces.js +3 -0
- package/lib/rbac-http/src/interfaces.js.map +1 -0
- package/lib/rbac-http/src/middlewares.d.ts +11 -0
- package/lib/rbac-http/src/middlewares.js +85 -0
- package/lib/rbac-http/src/middlewares.js.map +1 -0
- package/lib/rbac-http/src/policies.d.ts +13 -0
- package/lib/rbac-http/src/policies.js +57 -0
- package/lib/rbac-http/src/policies.js.map +1 -0
- package/lib/rbac-http/src/route-args.d.ts +9 -0
- package/lib/rbac-http/src/route-args.js +24 -0
- package/lib/rbac-http/src/route-args.js.map +1 -0
- package/lib/rbac-http/src/transformers.d.ts +11 -0
- package/lib/rbac-http/src/transformers.js +34 -0
- package/lib/rbac-http/src/transformers.js.map +1 -0
- package/package.json +11 -10
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataTransformer = exports.BasePolicy = exports.BaseMiddleware = exports.ParameterType = exports.UuidVersion = exports.RouteType = exports.HTTP_STATUS_CODE = exports.ServerMiddleware = exports.HttpAcceptHeaders = void 0;
|
|
4
|
+
const di_1 = require("@spinajs/di");
|
|
5
|
+
/**
|
|
6
|
+
* Accept header enum
|
|
7
|
+
*/
|
|
8
|
+
var HttpAcceptHeaders;
|
|
9
|
+
(function (HttpAcceptHeaders) {
|
|
10
|
+
/**
|
|
11
|
+
* Accept header for JSON
|
|
12
|
+
*/
|
|
13
|
+
HttpAcceptHeaders[HttpAcceptHeaders["JSON"] = 1] = "JSON";
|
|
14
|
+
/**
|
|
15
|
+
* Accept header for HTML
|
|
16
|
+
*/
|
|
17
|
+
HttpAcceptHeaders[HttpAcceptHeaders["HTML"] = 2] = "HTML";
|
|
18
|
+
/**
|
|
19
|
+
* Accept header for XML
|
|
20
|
+
*/
|
|
21
|
+
HttpAcceptHeaders[HttpAcceptHeaders["XML"] = 4] = "XML";
|
|
22
|
+
/**
|
|
23
|
+
* Accept all accept headers shorcut
|
|
24
|
+
*/
|
|
25
|
+
HttpAcceptHeaders[HttpAcceptHeaders["ALL"] = 7] = "ALL";
|
|
26
|
+
})(HttpAcceptHeaders = exports.HttpAcceptHeaders || (exports.HttpAcceptHeaders = {}));
|
|
27
|
+
class ServerMiddleware extends di_1.AsyncModule {
|
|
28
|
+
}
|
|
29
|
+
exports.ServerMiddleware = ServerMiddleware;
|
|
30
|
+
/**
|
|
31
|
+
* HTTP response statuses
|
|
32
|
+
*/
|
|
33
|
+
var HTTP_STATUS_CODE;
|
|
34
|
+
(function (HTTP_STATUS_CODE) {
|
|
35
|
+
/**
|
|
36
|
+
* All ok with content
|
|
37
|
+
*/
|
|
38
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["OK"] = 200] = "OK";
|
|
39
|
+
/**
|
|
40
|
+
* Request is OK and new resource has been created.
|
|
41
|
+
*/
|
|
42
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["CREATED"] = 201] = "CREATED";
|
|
43
|
+
/**
|
|
44
|
+
* Request is accepted, but has not been completed yet.
|
|
45
|
+
*/
|
|
46
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["ACCEPTED"] = 202] = "ACCEPTED";
|
|
47
|
+
/**
|
|
48
|
+
* ALl is ok & no content to return
|
|
49
|
+
*/
|
|
50
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["NO_CONTENT"] = 204] = "NO_CONTENT";
|
|
51
|
+
/**
|
|
52
|
+
* The server is delivering only part of the resource (byte serving) due to a range header
|
|
53
|
+
* sent by the client. The range header is used by HTTP clients to enable resuming of
|
|
54
|
+
* interrupted downloads, or split a download into multiple simultaneous streams.
|
|
55
|
+
*/
|
|
56
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["PARTIAL_CONTENT"] = 206] = "PARTIAL_CONTENT";
|
|
57
|
+
/**
|
|
58
|
+
* Resource is not modified
|
|
59
|
+
*/
|
|
60
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["NOT_MODIFIED"] = 304] = "NOT_MODIFIED";
|
|
61
|
+
/**
|
|
62
|
+
* Invalid request, eg. invalid parameters
|
|
63
|
+
*/
|
|
64
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["BAD_REQUEST"] = 400] = "BAD_REQUEST";
|
|
65
|
+
/**
|
|
66
|
+
* Auth required
|
|
67
|
+
*/
|
|
68
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["UNAUTHORIZED"] = 401] = "UNAUTHORIZED";
|
|
69
|
+
/**
|
|
70
|
+
* No permission
|
|
71
|
+
*/
|
|
72
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["FORBIDDEN"] = 403] = "FORBIDDEN";
|
|
73
|
+
/**
|
|
74
|
+
* Resource not found
|
|
75
|
+
*/
|
|
76
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["NOT_FOUND"] = 404] = "NOT_FOUND";
|
|
77
|
+
/**
|
|
78
|
+
* Not acceptable request headers (Accept header)
|
|
79
|
+
*/
|
|
80
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["NOT_ACCEPTABLE"] = 406] = "NOT_ACCEPTABLE";
|
|
81
|
+
/**
|
|
82
|
+
* Conflict
|
|
83
|
+
*/
|
|
84
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["CONFLICT"] = 409] = "CONFLICT";
|
|
85
|
+
/**
|
|
86
|
+
* Internal server error.
|
|
87
|
+
*/
|
|
88
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["INTERNAL_ERROR"] = 500] = "INTERNAL_ERROR";
|
|
89
|
+
/**
|
|
90
|
+
* Method not implemented
|
|
91
|
+
*/
|
|
92
|
+
HTTP_STATUS_CODE[HTTP_STATUS_CODE["NOT_IMPLEMENTED"] = 501] = "NOT_IMPLEMENTED";
|
|
93
|
+
})(HTTP_STATUS_CODE = exports.HTTP_STATUS_CODE || (exports.HTTP_STATUS_CODE = {}));
|
|
94
|
+
/**
|
|
95
|
+
* Avaible route types, match HTTP methods
|
|
96
|
+
*/
|
|
97
|
+
var RouteType;
|
|
98
|
+
(function (RouteType) {
|
|
99
|
+
/**
|
|
100
|
+
* POST method - used to create new resource or send data to server
|
|
101
|
+
*/
|
|
102
|
+
RouteType["POST"] = "post";
|
|
103
|
+
/**
|
|
104
|
+
* GET method - used to retrieve data from server
|
|
105
|
+
*/
|
|
106
|
+
RouteType["GET"] = "get";
|
|
107
|
+
/**
|
|
108
|
+
* PUT method - used to updates resource
|
|
109
|
+
*/
|
|
110
|
+
RouteType["PUT"] = "put";
|
|
111
|
+
/**
|
|
112
|
+
* DELETE method - used to delete resource
|
|
113
|
+
*/
|
|
114
|
+
RouteType["DELETE"] = "delete";
|
|
115
|
+
/**
|
|
116
|
+
* PATCH method - used to partially update resource eg. one field
|
|
117
|
+
*/
|
|
118
|
+
RouteType["PATCH"] = "patch";
|
|
119
|
+
/**
|
|
120
|
+
* HEAD method - same as get, but returns no data. usefull for checking if resource exists etc.
|
|
121
|
+
*/
|
|
122
|
+
RouteType["HEAD"] = "head";
|
|
123
|
+
/**
|
|
124
|
+
* FILE method - spine special route type. Internall its simple GET method, but informs that specified route returns binary file
|
|
125
|
+
*/
|
|
126
|
+
RouteType["FILE"] = "file";
|
|
127
|
+
RouteType["UNKNOWN"] = "unknown";
|
|
128
|
+
})(RouteType = exports.RouteType || (exports.RouteType = {}));
|
|
129
|
+
var UuidVersion;
|
|
130
|
+
(function (UuidVersion) {
|
|
131
|
+
UuidVersion[UuidVersion["v1"] = 0] = "v1";
|
|
132
|
+
UuidVersion[UuidVersion["v3"] = 1] = "v3";
|
|
133
|
+
UuidVersion[UuidVersion["v4"] = 2] = "v4";
|
|
134
|
+
UuidVersion[UuidVersion["v5"] = 3] = "v5";
|
|
135
|
+
})(UuidVersion = exports.UuidVersion || (exports.UuidVersion = {}));
|
|
136
|
+
/**
|
|
137
|
+
* Avaible route parameters type
|
|
138
|
+
*/
|
|
139
|
+
var ParameterType;
|
|
140
|
+
(function (ParameterType) {
|
|
141
|
+
/**
|
|
142
|
+
* Parameter is injected from DI container & resolved
|
|
143
|
+
*/
|
|
144
|
+
ParameterType["FromDi"] = "FromDi";
|
|
145
|
+
/**
|
|
146
|
+
* Parameter value is taken from query string eg. `?name=flavio`
|
|
147
|
+
*/
|
|
148
|
+
ParameterType["FromQuery"] = "FromQuery";
|
|
149
|
+
/**
|
|
150
|
+
* From message body, eg. POST json object
|
|
151
|
+
*/
|
|
152
|
+
ParameterType["FromBody"] = "FromBody";
|
|
153
|
+
/**
|
|
154
|
+
* From url params eg: `/:id`
|
|
155
|
+
*/
|
|
156
|
+
ParameterType["FromParams"] = "FromParams";
|
|
157
|
+
/**
|
|
158
|
+
* From form file field
|
|
159
|
+
*/
|
|
160
|
+
ParameterType["FromFile"] = "FromFile";
|
|
161
|
+
/**
|
|
162
|
+
* From form
|
|
163
|
+
*/
|
|
164
|
+
ParameterType["FromForm"] = "FromForm";
|
|
165
|
+
/**
|
|
166
|
+
* From cvs file
|
|
167
|
+
*/
|
|
168
|
+
ParameterType["FromCSV"] = "FromCSV";
|
|
169
|
+
/**
|
|
170
|
+
* From JSON file
|
|
171
|
+
*/
|
|
172
|
+
ParameterType["FromJSONFile"] = "FromJSONFile";
|
|
173
|
+
/**
|
|
174
|
+
* From form field
|
|
175
|
+
*/
|
|
176
|
+
ParameterType["FormField"] = "FromFormField";
|
|
177
|
+
/**
|
|
178
|
+
* From model object
|
|
179
|
+
*/
|
|
180
|
+
ParameterType["FromModel"] = "FromModel";
|
|
181
|
+
/**
|
|
182
|
+
* Data from coockie
|
|
183
|
+
*/
|
|
184
|
+
ParameterType["FromCookie"] = "FromCookie";
|
|
185
|
+
/**
|
|
186
|
+
* From http header
|
|
187
|
+
*/
|
|
188
|
+
ParameterType["FromHeader"] = "FromHeader";
|
|
189
|
+
/**
|
|
190
|
+
* Req from express
|
|
191
|
+
*/
|
|
192
|
+
ParameterType["Req"] = "ArgAsRequest";
|
|
193
|
+
// Res from express
|
|
194
|
+
ParameterType["Res"] = "ArgAsResponse";
|
|
195
|
+
})(ParameterType = exports.ParameterType || (exports.ParameterType = {}));
|
|
196
|
+
/**
|
|
197
|
+
* Middlewares are classes that can change request object or perform specific task before & after route execution
|
|
198
|
+
* eg. route parameter logging / headers check etc.
|
|
199
|
+
*/
|
|
200
|
+
class BaseMiddleware {
|
|
201
|
+
}
|
|
202
|
+
exports.BaseMiddleware = BaseMiddleware;
|
|
203
|
+
/**
|
|
204
|
+
* Base class for policies.
|
|
205
|
+
*
|
|
206
|
+
* Policies checks if route can be executed eg. user have proper role
|
|
207
|
+
*/
|
|
208
|
+
class BasePolicy {
|
|
209
|
+
}
|
|
210
|
+
exports.BasePolicy = BasePolicy;
|
|
211
|
+
/**
|
|
212
|
+
* Base class for data transformers.
|
|
213
|
+
*
|
|
214
|
+
* Data formatter helps transforms data for desired format.
|
|
215
|
+
* Eg. we have API function that returns some data, but we want
|
|
216
|
+
* to easily transform data for some client
|
|
217
|
+
* eg. plain array to format that datatables.net can easily read
|
|
218
|
+
*/
|
|
219
|
+
class DataTransformer {
|
|
220
|
+
}
|
|
221
|
+
exports.DataTransformer = DataTransformer;
|
|
222
|
+
//# sourceMappingURL=interfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../http/src/interfaces.ts"],"names":[],"mappings":";;;AACA,oCAAuD;AAGvD;;GAEG;AACH,IAAY,iBAoBX;AApBD,WAAY,iBAAiB;IAC3B;;OAEG;IACH,yDAAQ,CAAA;IAER;;OAEG;IACH,yDAAQ,CAAA;IAER;;OAEG;IACH,uDAAO,CAAA;IAEP;;OAEG;IACH,uDAAe,CAAA;AACjB,CAAC,EApBW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAoB5B;AAsCD,MAAsB,gBAAiB,SAAQ,gBAAW;CAKzD;AALD,4CAKC;AAED;;GAEG;AACH,IAAY,gBAwEX;AAxED,WAAY,gBAAgB;IAC1B;;OAEG;IACH,qDAAQ,CAAA;IAER;;OAEG;IACH,+DAAa,CAAA;IAEb;;OAEG;IACH,iEAAc,CAAA;IAEd;;OAEG;IACH,qEAAgB,CAAA;IAEhB;;;;OAIG;IACH,+EAAqB,CAAA;IAErB;;OAEG;IACH,yEAAkB,CAAA;IAElB;;OAEG;IACH,uEAAiB,CAAA;IAEjB;;OAEG;IACH,yEAAkB,CAAA;IAElB;;OAEG;IACH,mEAAe,CAAA;IAEf;;OAEG;IACH,mEAAe,CAAA;IAEf;;OAEG;IACH,6EAAoB,CAAA;IAEpB;;OAEG;IACH,iEAAc,CAAA;IAEd;;OAEG;IACH,6EAAoB,CAAA;IAEpB;;OAEG;IACH,+EAAqB,CAAA;AACvB,CAAC,EAxEW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAwE3B;AAED;;GAEG;AACH,IAAY,SAqCX;AArCD,WAAY,SAAS;IACnB;;OAEG;IACH,0BAAa,CAAA;IAEb;;OAEG;IACH,wBAAW,CAAA;IAEX;;OAEG;IACH,wBAAW,CAAA;IAEX;;OAEG;IACH,8BAAiB,CAAA;IAEjB;;OAEG;IACH,4BAAe,CAAA;IAEf;;OAEG;IACH,0BAAa,CAAA;IAEb;;OAEG;IACH,0BAAa,CAAA;IAEb,gCAAmB,CAAA;AACrB,CAAC,EArCW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAqCpB;AAED,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,yCAAE,CAAA;IACF,yCAAE,CAAA;IACF,yCAAE,CAAA;IACF,yCAAE,CAAA;AACJ,CAAC,EALW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAKtB;AAED;;GAEG;AACH,IAAY,aAoEX;AApED,WAAY,aAAa;IACvB;;OAEG;IACH,kCAAiB,CAAA;IAEjB;;OAEG;IACH,wCAAuB,CAAA;IAEvB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,oCAAmB,CAAA;IAEnB;;OAEG;IACH,8CAA6B,CAAA;IAE7B;;OAEG;IACH,4CAA2B,CAAA;IAE3B;;OAEG;IACH,wCAAuB,CAAA;IAEvB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,qCAAoB,CAAA;IAEpB,mBAAmB;IACnB,sCAAqB,CAAA;AACvB,CAAC,EApEW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAoExB;AA0KD;;;GAGG;AACH,MAAsB,cAAc;CAenC;AAfD,wCAeC;AAWD;;;;GAIG;AACH,MAAsB,UAAU;CAgB/B;AAhBD,gCAgBC;AA2BD;;;;;;;GAOG;AACH,MAAsB,eAAe;CASpC;AATD,0CASC"}
|
package/lib/interfaces.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare type PermissionType = 'readAny' | 'readOwn' | 'updateAny' | 'updateOwn' | 'deleteAny' | 'deleteOwn' | 'createAny' | 'createOwn';
|
|
2
|
-
export interface
|
|
2
|
+
export interface IRbacDescriptor {
|
|
3
3
|
/**
|
|
4
4
|
* Resource name
|
|
5
5
|
*/
|
|
@@ -13,9 +13,9 @@ export interface IAclDescriptor {
|
|
|
13
13
|
/**
|
|
14
14
|
* Per routes permissions
|
|
15
15
|
*/
|
|
16
|
-
Routes: Map<string,
|
|
16
|
+
Routes: Map<string, IRbacRoutePermissionDescriptor>;
|
|
17
17
|
}
|
|
18
|
-
export interface
|
|
18
|
+
export interface IRbacRoutePermissionDescriptor {
|
|
19
19
|
/**
|
|
20
20
|
* controller route permission. It overrides acl descriptor options
|
|
21
21
|
*/
|
package/lib/policies.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import { AccessControl } from '
|
|
1
|
+
import { AccessControl, Permission } from 'accesscontrol';
|
|
2
2
|
import { BasePolicy, IController, IRoute } from '@spinajs/http';
|
|
3
3
|
import * as express from 'express';
|
|
4
|
-
|
|
4
|
+
import { User } from '@spinajs/rbac';
|
|
5
|
+
export declare class RbacPolicy extends BasePolicy {
|
|
5
6
|
protected Ac: AccessControl;
|
|
6
7
|
constructor();
|
|
7
8
|
isEnabled(_action: IRoute, _instance: IController): boolean;
|
|
8
9
|
execute(req: express.Request, action: IRoute, instance: IController): Promise<void>;
|
|
9
10
|
}
|
|
11
|
+
export declare function checkRbacPermission(role: string | string[], resource: string, permission: string): Permission;
|
|
12
|
+
export declare function checkUserPermission(user: User, resource: string, permission: string): Permission;
|
|
13
|
+
export declare function checkRoutePermission(req: express.Request, resource: string, permission: string): Permission;
|
package/lib/policies.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.checkRoutePermission = exports.checkUserPermission = exports.checkRbacPermission = exports.RbacPolicy = void 0;
|
|
4
4
|
const http_1 = require("@spinajs/http");
|
|
5
5
|
const exceptions_1 = require("@spinajs/exceptions");
|
|
6
6
|
const decorators_1 = require("./decorators");
|
|
7
7
|
const di_1 = require("@spinajs/di");
|
|
8
|
-
class
|
|
8
|
+
class RbacPolicy extends http_1.BasePolicy {
|
|
9
9
|
constructor() {
|
|
10
10
|
super();
|
|
11
11
|
this.Ac = di_1.DI.get('AccessControl');
|
|
@@ -28,10 +28,30 @@ class AclPolicy extends http_1.BasePolicy {
|
|
|
28
28
|
if (!req.User) {
|
|
29
29
|
throw new exceptions_1.AuthenticationFailed();
|
|
30
30
|
}
|
|
31
|
-
if (!
|
|
31
|
+
if (!checkRoutePermission(req, descriptor.Resource, permission).granted) {
|
|
32
32
|
throw new exceptions_1.Forbidden(`role(s) ${req.User.Role} does not have permission ${permission} for resource ${descriptor.Resource}`);
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
exports.
|
|
36
|
+
exports.RbacPolicy = RbacPolicy;
|
|
37
|
+
function checkRbacPermission(role, resource, permission) {
|
|
38
|
+
const ac = di_1.DI.get('AccessControl');
|
|
39
|
+
return ac.can(role)[permission](resource);
|
|
40
|
+
}
|
|
41
|
+
exports.checkRbacPermission = checkRbacPermission;
|
|
42
|
+
function checkUserPermission(user, resource, permission) {
|
|
43
|
+
const ac = di_1.DI.get('AccessControl');
|
|
44
|
+
if (!user) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
return ac.can(user.Role.split(','))[permission](resource);
|
|
48
|
+
}
|
|
49
|
+
exports.checkUserPermission = checkUserPermission;
|
|
50
|
+
function checkRoutePermission(req, resource, permission) {
|
|
51
|
+
if (!req.User) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return checkUserPermission(req.User, resource, permission);
|
|
55
|
+
}
|
|
56
|
+
exports.checkRoutePermission = checkRoutePermission;
|
|
37
57
|
//# sourceMappingURL=policies.js.map
|
package/lib/policies.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":";;;AACA,wCAAgE;AAEhE,oDAAsE;AACtE,6CAAyD;AAEzD,oCAAiC;
|
|
1
|
+
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":";;;AACA,wCAAgE;AAEhE,oDAAsE;AACtE,6CAAyD;AAEzD,oCAAiC;AAGjC,MAAa,UAAW,SAAQ,iBAAU;IAGxC;QACE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,EAAE,GAAG,OAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IAEM,SAAS,CAAC,OAAe,EAAE,SAAsB;QACtD,0BAA0B;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAAoB,EAAE,MAAc,EAAE,QAAqB;;QAC9E,MAAM,UAAU,GAAoB,OAAO,CAAC,WAAW,CAAC,sCAAyB,EAAE,QAAQ,CAAC,CAAC;QAC7F,IAAI,UAAU,GAAG,MAAA,UAAU,CAAC,UAAU,mCAAI,EAAE,CAAC;QAE7C,wCAAwC;QACxC,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACxC,UAAU,GAAG,MAAA,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,mCAAI,EAAE,CAAC;SACpE;QAED,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;YACzC,MAAM,IAAI,sBAAS,CAAC,2CAA2C,CAAC,CAAC;SAClE;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YACb,MAAM,IAAI,iCAAoB,EAAE,CAAC;SAClC;QAED,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE;YACvE,MAAM,IAAI,sBAAS,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,IAAI,6BAA6B,UAAU,iBAAiB,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC5H;IACH,CAAC;CACF;AAnCD,gCAmCC;AAED,SAAgB,mBAAmB,CAAC,IAAuB,EAAE,QAAgB,EAAE,UAAkB;IAC/F,MAAM,EAAE,GAAG,OAAE,CAAC,GAAG,CAAgB,eAAe,CAAC,CAAC;IAClD,OAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;AACrD,CAAC;AAHD,kDAGC;AAED,SAAgB,mBAAmB,CAAC,IAAU,EAAE,QAAgB,EAAE,UAAkB;IAClF,MAAM,EAAE,GAAG,OAAE,CAAC,GAAG,CAAgB,eAAe,CAAC,CAAC;IAElD,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,IAAI,CAAC;KACb;IAED,OAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;AACrE,CAAC;AARD,kDAQC;AAED,SAAgB,oBAAoB,CAAC,GAAoB,EAAE,QAAgB,EAAE,UAAkB;IAC7F,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QACb,OAAO,IAAI,CAAC;KACb;IAED,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC7D,CAAC;AAND,oDAMC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"augumentation.js","sourceRoot":"","sources":["../../../src/augumentation.ts"],"names":[],"mappings":";;AAAA,yBAAuB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const path_1 = require("path");
|
|
4
|
+
function dir(path) {
|
|
5
|
+
return (0, path_1.resolve)((0, path_1.normalize)((0, path_1.join)(__dirname, path)));
|
|
6
|
+
}
|
|
7
|
+
module.exports = {
|
|
8
|
+
system: {
|
|
9
|
+
dirs: {
|
|
10
|
+
controllers: [dir('./../controllers')],
|
|
11
|
+
locales: [dir('./../locales')],
|
|
12
|
+
views: [dir('./../views')],
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
http: {
|
|
16
|
+
middlewares: [
|
|
17
|
+
// add global user from session middleware
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=rbac-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rbac-http.js","sourceRoot":"","sources":["../../../../src/config/rbac-http.ts"],"names":[],"mappings":";;AAAA,+BAAgD;AAEhD,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,IAAA,cAAO,EAAC,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AACD,MAAM,CAAC,OAAO,GAAG;IACf,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,WAAW,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC9B,KAAK,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;SAC3B;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE;QACX,0CAA0C;SAC3C;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { LoginDto } from './../dto/login-dto';
|
|
2
|
+
import { BaseController, Ok, CookieResponse, Unauthorized } from '@spinajs/http';
|
|
3
|
+
import { AuthProvider, SessionProvider } from '@spinajs/rbac';
|
|
4
|
+
import { Configuration } from '@spinajs/configuration';
|
|
5
|
+
export declare class LoginController extends BaseController {
|
|
6
|
+
protected Configuration: Configuration;
|
|
7
|
+
protected AuthProvider: AuthProvider;
|
|
8
|
+
protected SessionProvider: SessionProvider;
|
|
9
|
+
protected SessionExpirationTime: number;
|
|
10
|
+
login(credentials: LoginDto): Promise<Unauthorized | CookieResponse>;
|
|
11
|
+
logout(ssid: string): Promise<Ok | CookieResponse>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.LoginController = void 0;
|
|
16
|
+
const login_dto_1 = require("./../dto/login-dto");
|
|
17
|
+
const http_1 = require("@spinajs/http");
|
|
18
|
+
const rbac_1 = require("@spinajs/rbac");
|
|
19
|
+
const di_1 = require("@spinajs/di");
|
|
20
|
+
const configuration_1 = require("@spinajs/configuration");
|
|
21
|
+
const luxon_1 = require("luxon");
|
|
22
|
+
let LoginController = class LoginController extends http_1.BaseController {
|
|
23
|
+
async login(credentials) {
|
|
24
|
+
const user = await this.AuthProvider.authenticate(credentials.Login, credentials.Password);
|
|
25
|
+
if (!user) {
|
|
26
|
+
return new http_1.Unauthorized({
|
|
27
|
+
error: {
|
|
28
|
+
message: 'login or password incorrect',
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const lifetime = luxon_1.DateTime.now().plus({ minutes: this.SessionExpirationTime });
|
|
33
|
+
const uObject = {
|
|
34
|
+
Login: user.Login,
|
|
35
|
+
Email: user.Email,
|
|
36
|
+
NiceName: user.NiceName,
|
|
37
|
+
Metadata: user.Metadata.map((m) => ({ Key: m.Key, Value: m.Value })),
|
|
38
|
+
Role: user.Role,
|
|
39
|
+
Id: user.Id,
|
|
40
|
+
};
|
|
41
|
+
const session = new rbac_1.Session({
|
|
42
|
+
Data: uObject,
|
|
43
|
+
Expiration: lifetime,
|
|
44
|
+
});
|
|
45
|
+
await this.SessionProvider.updateSession(session);
|
|
46
|
+
return new http_1.CookieResponse('ssid', session.SessionId, this.SessionExpirationTime, uObject);
|
|
47
|
+
}
|
|
48
|
+
async logout(ssid) {
|
|
49
|
+
if (!ssid) {
|
|
50
|
+
return new http_1.Ok();
|
|
51
|
+
}
|
|
52
|
+
await this.SessionProvider.deleteSession(ssid);
|
|
53
|
+
// send empty cookie to confirm session deletion
|
|
54
|
+
return new http_1.CookieResponse('ssid', null, this.SessionExpirationTime);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
__decorate([
|
|
58
|
+
(0, di_1.Autoinject)(),
|
|
59
|
+
__metadata("design:type", configuration_1.Configuration)
|
|
60
|
+
], LoginController.prototype, "Configuration", void 0);
|
|
61
|
+
__decorate([
|
|
62
|
+
(0, di_1.Autoinject)(),
|
|
63
|
+
__metadata("design:type", rbac_1.AuthProvider)
|
|
64
|
+
], LoginController.prototype, "AuthProvider", void 0);
|
|
65
|
+
__decorate([
|
|
66
|
+
(0, di_1.Autoinject)(),
|
|
67
|
+
__metadata("design:type", rbac_1.SessionProvider)
|
|
68
|
+
], LoginController.prototype, "SessionProvider", void 0);
|
|
69
|
+
__decorate([
|
|
70
|
+
(0, configuration_1.Config)('acl.session.expiration', 10),
|
|
71
|
+
__metadata("design:type", Number)
|
|
72
|
+
], LoginController.prototype, "SessionExpirationTime", void 0);
|
|
73
|
+
__decorate([
|
|
74
|
+
(0, http_1.Post)(),
|
|
75
|
+
__param(0, (0, http_1.Body)()),
|
|
76
|
+
__metadata("design:type", Function),
|
|
77
|
+
__metadata("design:paramtypes", [login_dto_1.LoginDto]),
|
|
78
|
+
__metadata("design:returntype", Promise)
|
|
79
|
+
], LoginController.prototype, "login", null);
|
|
80
|
+
__decorate([
|
|
81
|
+
(0, http_1.Get)(),
|
|
82
|
+
__param(0, (0, http_1.Cookie)()),
|
|
83
|
+
__metadata("design:type", Function),
|
|
84
|
+
__metadata("design:paramtypes", [String]),
|
|
85
|
+
__metadata("design:returntype", Promise)
|
|
86
|
+
], LoginController.prototype, "logout", null);
|
|
87
|
+
LoginController = __decorate([
|
|
88
|
+
(0, http_1.BasePath)('auth')
|
|
89
|
+
], LoginController);
|
|
90
|
+
exports.LoginController = LoginController;
|
|
91
|
+
//# sourceMappingURL=LoginController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoginController.js","sourceRoot":"","sources":["../../../../src/controllers/LoginController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kDAA8C;AAC9C,wCAAoH;AACpH,wCAAuE;AACvE,oCAAyC;AACzC,0DAA+D;AAC/D,iCAAiC;AAGjC,IAAa,eAAe,GAA5B,MAAa,eAAgB,SAAQ,qBAAc;IAc1C,KAAK,CAAC,KAAK,CAAS,WAAqB;QAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;QAE3F,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,mBAAY,CAAC;gBACtB,KAAK,EAAE;oBACL,OAAO,EAAE,6BAA6B;iBACvC;aACF,CAAC,CAAC;SACJ;QACD,MAAM,QAAQ,GAAG,gBAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAE9E,MAAM,OAAO,GAAG;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACpE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;SACZ,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC;YAC1B,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAElD,OAAO,IAAI,qBAAc,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC5F,CAAC;IAGM,KAAK,CAAC,MAAM,CAAW,IAAY;QACxC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,SAAE,EAAE,CAAC;SACjB;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAE/C,gDAAgD;QAChD,OAAO,IAAI,qBAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACtE,CAAC;CACF,CAAA;AAtDC;IADC,IAAA,eAAU,GAAE;8BACY,6BAAa;sDAAC;AAGvC;IADC,IAAA,eAAU,GAAE;8BACW,mBAAY;qDAAC;AAGrC;IADC,IAAA,eAAU,GAAE;8BACc,sBAAe;wDAAC;AAG3C;IADC,IAAA,sBAAM,EAAC,wBAAwB,EAAE,EAAE,CAAC;;8DACG;AAGxC;IADC,IAAA,WAAI,GAAE;IACa,WAAA,IAAA,WAAI,GAAE,CAAA;;qCAAc,oBAAQ;;4CA6B/C;AAGD;IADC,IAAA,UAAG,GAAE;IACe,WAAA,IAAA,aAAM,GAAE,CAAA;;;;6CAS5B;AAvDU,eAAe;IAD3B,IAAA,eAAQ,EAAC,MAAM,CAAC;GACJ,eAAe,CAwD3B;AAxDY,0CAAe"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PasswordDto } from './../dto/password-dto';
|
|
2
|
+
import { UserDto } from './../dto/user-dto';
|
|
3
|
+
import * as express from 'express';
|
|
4
|
+
import { BaseController, Ok, NotFound } from '@spinajs/http';
|
|
5
|
+
import { IContainer } from '@spinajs/di';
|
|
6
|
+
import { UserDataTransformer, IUserResult } from '../transformers';
|
|
7
|
+
import { SORT_ORDER } from '@spinajs/orm/lib/enums';
|
|
8
|
+
export declare class UsersController extends BaseController {
|
|
9
|
+
protected DataTransformer: UserDataTransformer<IUserResult>;
|
|
10
|
+
protected Container: IContainer;
|
|
11
|
+
listUsers(search: string, page: number, perPage: number, order: string, orderDirection: SORT_ORDER, request: express.Request): Promise<NotFound | Ok>;
|
|
12
|
+
getUser(id: number): Promise<Ok>;
|
|
13
|
+
addUser(user: UserDto): Promise<Ok>;
|
|
14
|
+
deleteUser(id: number): Promise<Ok>;
|
|
15
|
+
updateUser(id: number, user: UserDto): Promise<Ok>;
|
|
16
|
+
updateUserPassword(id: number, pwd: PasswordDto): Promise<Ok>;
|
|
17
|
+
}
|