sentinel-nestjs-core 0.1.0
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 +47 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/logger.interceptor.d.ts +8 -0
- package/dist/logger/logger.interceptor.js +45 -0
- package/dist/logger/logger.interceptor.js.map +1 -0
- package/dist/logger/logger.interceptor.spec.d.ts +0 -0
- package/dist/logger/logger.interceptor.spec.js +2 -0
- package/dist/logger/logger.interceptor.spec.js.map +1 -0
- package/dist/logger/logger.module.d.ts +2 -0
- package/dist/logger/logger.module.js +22 -0
- package/dist/logger/logger.module.js.map +1 -0
- package/dist/logger/logger.service.d.ts +10 -0
- package/dist/logger/logger.service.js +124 -0
- package/dist/logger/logger.service.js.map +1 -0
- package/dist/logger/logger.service.spec.d.ts +1 -0
- package/dist/logger/logger.service.spec.js +17 -0
- package/dist/logger/logger.service.spec.js.map +1 -0
- package/dist/permission/decorator/permission.decorator.d.ts +2 -0
- package/dist/permission/decorator/permission.decorator.js +12 -0
- package/dist/permission/decorator/permission.decorator.js.map +1 -0
- package/dist/permission/decorator/user.decorator.d.ts +1 -0
- package/dist/permission/decorator/user.decorator.js +9 -0
- package/dist/permission/decorator/user.decorator.js.map +1 -0
- package/dist/permission/guard/jwt-auth.guard.d.ts +4 -0
- package/dist/permission/guard/jwt-auth.guard.js +18 -0
- package/dist/permission/guard/jwt-auth.guard.js.map +1 -0
- package/dist/permission/guard/permission.guard.d.ts +9 -0
- package/dist/permission/guard/permission.guard.js +53 -0
- package/dist/permission/guard/permission.guard.js.map +1 -0
- package/dist/permission/interfaces/jwt-key.interface.d.ts +14 -0
- package/dist/permission/interfaces/jwt-key.interface.js +3 -0
- package/dist/permission/interfaces/jwt-key.interface.js.map +1 -0
- package/dist/permission/interfaces/payload.interface.d.ts +7 -0
- package/dist/permission/interfaces/payload.interface.js +3 -0
- package/dist/permission/interfaces/payload.interface.js.map +1 -0
- package/dist/permission/interfaces/permission-decoded.interface.d.ts +4 -0
- package/dist/permission/interfaces/permission-decoded.interface.js +3 -0
- package/dist/permission/interfaces/permission-decoded.interface.js.map +1 -0
- package/dist/permission/interfaces/permission-encoded.interface.d.ts +4 -0
- package/dist/permission/interfaces/permission-encoded.interface.js +3 -0
- package/dist/permission/interfaces/permission-encoded.interface.js.map +1 -0
- package/dist/permission/interfaces/sentinel-permission-options.interface.d.ts +4 -0
- package/dist/permission/interfaces/sentinel-permission-options.interface.js +3 -0
- package/dist/permission/interfaces/sentinel-permission-options.interface.js.map +1 -0
- package/dist/permission/permission.map.d.ts +1 -0
- package/dist/permission/permission.map.js +14 -0
- package/dist/permission/permission.map.js.map +1 -0
- package/dist/permission/sentinel-permission.module.d.ts +8 -0
- package/dist/permission/sentinel-permission.module.js +39 -0
- package/dist/permission/sentinel-permission.module.js.map +1 -0
- package/dist/permission/services/key/key.service.d.ts +9 -0
- package/dist/permission/services/key/key.service.js +85 -0
- package/dist/permission/services/key/key.service.js.map +1 -0
- package/dist/permission/services/key/key.service.spec.d.ts +1 -0
- package/dist/permission/services/key/key.service.spec.js +17 -0
- package/dist/permission/services/key/key.service.spec.js.map +1 -0
- package/dist/permission/services/permission/sentinel-permission.service.d.ts +7 -0
- package/dist/permission/services/permission/sentinel-permission.service.js +54 -0
- package/dist/permission/services/permission/sentinel-permission.service.js.map +1 -0
- package/dist/permission/services/permission/sentinel-permission.service.spec.d.ts +1 -0
- package/dist/permission/services/permission/sentinel-permission.service.spec.js +17 -0
- package/dist/permission/services/permission/sentinel-permission.service.spec.js.map +1 -0
- package/dist/permission/strategy/jwt.strategy.d.ts +19 -0
- package/dist/permission/strategy/jwt.strategy.js +103 -0
- package/dist/permission/strategy/jwt.strategy.js.map +1 -0
- package/dist/sentinel-nest-core.module.d.ts +8 -0
- package/dist/sentinel-nest-core.module.js +31 -0
- package/dist/sentinel-nest-core.module.js.map +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# sentinel-nest-core
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
Librairie destinée aux backs NestJS qui se connectent au serveur Sentinel.<br :>
|
|
5
|
+
Elle permet de gérer simplement les permissions d'accès aux APIs et de mettre en place un logger.
|
|
6
|
+
|
|
7
|
+
## Logger
|
|
8
|
+
|
|
9
|
+
Le logger est basé sur le paquet `winston` et `winston-daily-rotate-file`.<br />
|
|
10
|
+
Les fichiers logs sont dans le répertoire `log`.<br />
|
|
11
|
+
ATTENTION : il n'y a pas de gestion de suppression des fichiers actuellement.
|
|
12
|
+
|
|
13
|
+
### Installation et utilisation
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
// constructor
|
|
17
|
+
private readonly logger: LoggerAppService,
|
|
18
|
+
|
|
19
|
+
// méthod
|
|
20
|
+
logger.log('text');
|
|
21
|
+
logger.warn('text');
|
|
22
|
+
logger.debug('text');
|
|
23
|
+
logger.verbose('text');
|
|
24
|
+
logger.error('text', e);
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Permission
|
|
28
|
+
|
|
29
|
+
L'objectif de cette fonctionnalité et de proposer un guard `@Permission` afin de controller l'accès aux APIs.<br />
|
|
30
|
+
Il est développé pour tester le token fourni par Sentinel avec la clé publique transmis également par Snetinel.<br />
|
|
31
|
+
Les clés peuvent être renouvelées via le scheduler de Sentinel.
|
|
32
|
+
|
|
33
|
+
### Installation et utilisation
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
//app.module
|
|
37
|
+
SentinelCoreModule.forRootAsync({
|
|
38
|
+
useFactory: async (config: ConfigService) => ({
|
|
39
|
+
mode: 'remote',
|
|
40
|
+
apiSentinel: 'http://localhost:3000',
|
|
41
|
+
}),
|
|
42
|
+
inject: [ConfigService],
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
//controller
|
|
46
|
+
@Permission('resourceName', 'action')
|
|
47
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './sentinel-nest-core.module';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./sentinel-nest-core.module"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { LoggerAppService } from "./logger.service";
|
|
4
|
+
export declare class LoggerInterceptor implements NestInterceptor {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(logger: LoggerAppService);
|
|
7
|
+
intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.LoggerInterceptor = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const operators_1 = require("rxjs/operators");
|
|
15
|
+
const logger_service_1 = require("./logger.service");
|
|
16
|
+
let LoggerInterceptor = class LoggerInterceptor {
|
|
17
|
+
constructor(logger) {
|
|
18
|
+
this.logger = logger;
|
|
19
|
+
}
|
|
20
|
+
intercept(context, next) {
|
|
21
|
+
const req = context.switchToHttp().getRequest();
|
|
22
|
+
const res = context.switchToHttp().getResponse();
|
|
23
|
+
const { method, url } = req;
|
|
24
|
+
const controller = context.getClass().name;
|
|
25
|
+
const handler = context.getHandler().name;
|
|
26
|
+
const start = Date.now();
|
|
27
|
+
this.logger.debug(`[IN] ${method} ${url} → ${controller}.${handler}()`);
|
|
28
|
+
return next.handle().pipe((0, operators_1.tap)(() => {
|
|
29
|
+
const duration = Date.now() - start;
|
|
30
|
+
const statusCode = res.statusCode;
|
|
31
|
+
this.logger.log(`[OUT] ${method} ${url} ← ${controller}.${handler}() | ${statusCode} (${duration} ms)`);
|
|
32
|
+
}), (0, operators_1.catchError)((err) => {
|
|
33
|
+
var _a;
|
|
34
|
+
const duration = Date.now() - start;
|
|
35
|
+
this.logger.error(`[ERROR] ${method} ${url} ← ${controller}.${handler}() | ${(_a = res.statusCode) !== null && _a !== void 0 ? _a : 500} (${duration} ms)`, err.stack);
|
|
36
|
+
throw err;
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
exports.LoggerInterceptor = LoggerInterceptor;
|
|
41
|
+
exports.LoggerInterceptor = LoggerInterceptor = __decorate([
|
|
42
|
+
(0, common_1.Injectable)(),
|
|
43
|
+
__metadata("design:paramtypes", [logger_service_1.LoggerAppService])
|
|
44
|
+
], LoggerInterceptor);
|
|
45
|
+
//# sourceMappingURL=logger.interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.interceptor.js","sourceRoot":"","sources":["../../src/logger/logger.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AAExB,8CAAiD;AAEjD,qDAAkD;AAG3C,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,YAA6B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IAEzD,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACpD,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QACzD,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,WAAW,EAAY,CAAC;QAE3D,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;QAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAGzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,MAAM,IAAI,GAAG,MAAM,UAAU,IAAI,OAAO,IAAI,CAAC,CAAC;QAExE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACvB,IAAA,eAAG,EAAC,GAAG,EAAE;YACP,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACpC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,SAAS,MAAM,IAAI,GAAG,MAAM,UAAU,IAAI,OAAO,QAAQ,UAAU,KAAK,QAAQ,MAAM,CACvF,CAAC;QACJ,CAAC,CAAC,EACF,IAAA,sBAAU,EAAC,CAAC,GAAG,EAAE,EAAE;;YACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,WAAW,MAAM,IAAI,GAAG,MAAM,UAAU,IAAI,OAAO,QAAQ,MAAA,GAAG,CAAC,UAAU,mCAAI,GAAG,KAAK,QAAQ,MAAM,EACnG,GAAG,CAAC,KAAK,CACV,CAAC;YACF,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAA;AAjCY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;qCAE0B,iCAAgB;GAD1C,iBAAiB,CAiC7B"}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.interceptor.spec.js","sourceRoot":"","sources":["../../src/logger/logger.interceptor.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.LoggerModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const logger_service_1 = require("./logger.service");
|
|
12
|
+
let LoggerModule = class LoggerModule {
|
|
13
|
+
};
|
|
14
|
+
exports.LoggerModule = LoggerModule;
|
|
15
|
+
exports.LoggerModule = LoggerModule = __decorate([
|
|
16
|
+
(0, common_1.Global)(),
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
providers: [logger_service_1.LoggerAppService],
|
|
19
|
+
exports: [logger_service_1.LoggerAppService],
|
|
20
|
+
})
|
|
21
|
+
], LoggerModule);
|
|
22
|
+
//# sourceMappingURL=logger.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.module.js","sourceRoot":"","sources":["../../src/logger/logger.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA8C;AAC9C,qDAAoD;AAO7C,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IALxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,iCAAgB,CAAC;QAC7B,OAAO,EAAE,CAAC,iCAAgB,CAAC;KAC5B,CAAC;GACW,YAAY,CAAG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LoggerService } from '@nestjs/common';
|
|
2
|
+
export declare class LoggerAppService implements LoggerService {
|
|
3
|
+
private logger;
|
|
4
|
+
constructor();
|
|
5
|
+
log(message: string): void;
|
|
6
|
+
error(message: string, trace?: string): void;
|
|
7
|
+
warn(message: string): void;
|
|
8
|
+
debug(message: string): void;
|
|
9
|
+
verbose(message: string): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
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;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.LoggerAppService = void 0;
|
|
46
|
+
const common_1 = require("@nestjs/common");
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const winston = __importStar(require("winston"));
|
|
50
|
+
const DailyRotateFile = require('winston-daily-rotate-file');
|
|
51
|
+
let LoggerAppService = class LoggerAppService {
|
|
52
|
+
constructor() {
|
|
53
|
+
const logDir = process.env.LOG_PATH
|
|
54
|
+
? path.resolve(process.cwd(), process.env.LOG_PATH)
|
|
55
|
+
: path.resolve(process.cwd(), 'logs');
|
|
56
|
+
if (!fs.existsSync(logDir)) {
|
|
57
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
58
|
+
console.log(`[Logger] Dossier créé : ${logDir}`);
|
|
59
|
+
}
|
|
60
|
+
const level = process.env.LOG_LEVEL || 'info';
|
|
61
|
+
const datePattern = process.env.LOG_DATE_PATTERN || 'YYYY-MM-DD';
|
|
62
|
+
const maxFiles = process.env.LOG_MAX_DAYS || '14d';
|
|
63
|
+
const maxSize = process.env.LOG_MAX_SIZE || '20m';
|
|
64
|
+
const consoleFormat = winston.format.combine(winston.format.colorize(), winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.printf(({ timestamp, level, message }) => {
|
|
65
|
+
return `${timestamp} [${level}]: ${message}`;
|
|
66
|
+
}));
|
|
67
|
+
const fileFormat = winston.format.combine(winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.printf(({ timestamp, level, message }) => {
|
|
68
|
+
return `${timestamp} [${level}]: ${message}`;
|
|
69
|
+
}));
|
|
70
|
+
const combinedTransport = new DailyRotateFile({
|
|
71
|
+
level,
|
|
72
|
+
dirname: logDir,
|
|
73
|
+
filename: 'combined-%DATE%.log',
|
|
74
|
+
datePattern,
|
|
75
|
+
zippedArchive: true,
|
|
76
|
+
maxSize,
|
|
77
|
+
maxFiles,
|
|
78
|
+
format: fileFormat,
|
|
79
|
+
});
|
|
80
|
+
const errorTransport = new DailyRotateFile({
|
|
81
|
+
level: 'error',
|
|
82
|
+
dirname: logDir,
|
|
83
|
+
filename: 'error-%DATE%.log',
|
|
84
|
+
datePattern,
|
|
85
|
+
zippedArchive: true,
|
|
86
|
+
maxSize,
|
|
87
|
+
maxFiles,
|
|
88
|
+
format: fileFormat,
|
|
89
|
+
});
|
|
90
|
+
combinedTransport.on('new', (filename) => {
|
|
91
|
+
this.logger.info(`[Logger] Initialisation réussie — fichier ${filename}`);
|
|
92
|
+
});
|
|
93
|
+
this.logger = winston.createLogger({
|
|
94
|
+
level,
|
|
95
|
+
transports: [
|
|
96
|
+
new winston.transports.Console({ format: consoleFormat }),
|
|
97
|
+
combinedTransport,
|
|
98
|
+
errorTransport,
|
|
99
|
+
],
|
|
100
|
+
});
|
|
101
|
+
console.log(`[Logger] Winston initialisé au niveau "${level}"`);
|
|
102
|
+
}
|
|
103
|
+
log(message) {
|
|
104
|
+
this.logger.info(message);
|
|
105
|
+
}
|
|
106
|
+
error(message, trace) {
|
|
107
|
+
this.logger.error(trace ? `${message} - ${trace}` : message);
|
|
108
|
+
}
|
|
109
|
+
warn(message) {
|
|
110
|
+
this.logger.warn(message);
|
|
111
|
+
}
|
|
112
|
+
debug(message) {
|
|
113
|
+
this.logger.debug(message);
|
|
114
|
+
}
|
|
115
|
+
verbose(message) {
|
|
116
|
+
this.logger.verbose(message);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
exports.LoggerAppService = LoggerAppService;
|
|
120
|
+
exports.LoggerAppService = LoggerAppService = __decorate([
|
|
121
|
+
(0, common_1.Injectable)(),
|
|
122
|
+
__metadata("design:paramtypes", [])
|
|
123
|
+
], LoggerAppService);
|
|
124
|
+
//# sourceMappingURL=logger.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../src/logger/logger.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const testing_1 = require("@nestjs/testing");
|
|
4
|
+
const logger_service_1 = require("./logger.service");
|
|
5
|
+
describe('LoggerService', () => {
|
|
6
|
+
let service;
|
|
7
|
+
beforeEach(async () => {
|
|
8
|
+
const module = await testing_1.Test.createTestingModule({
|
|
9
|
+
providers: [logger_service_1.LoggerAppService],
|
|
10
|
+
}).compile();
|
|
11
|
+
service = module.get(logger_service_1.LoggerAppService);
|
|
12
|
+
});
|
|
13
|
+
it('should be defined', () => {
|
|
14
|
+
expect(service).toBeDefined();
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=logger.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.spec.js","sourceRoot":"","sources":["../../src/logger/logger.service.spec.ts"],"names":[],"mappings":";;AAAA,6CAAsD;AACtD,qDAAoD;AAEpD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,OAAyB,CAAC;IAE9B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,SAAS,EAAE,CAAC,iCAAgB,CAAC;SAC9B,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,OAAO,GAAG,MAAM,CAAC,GAAG,CAAmB,iCAAgB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const PERMISSION_METADATA = "permission_metadata";
|
|
2
|
+
export declare function Permission(resource: string, action: string): <TFunction extends Function, Y>(target: TFunction | object, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PERMISSION_METADATA = void 0;
|
|
4
|
+
exports.Permission = Permission;
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const jwt_auth_guard_1 = require("../guard/jwt-auth.guard");
|
|
7
|
+
const permission_guard_1 = require("../guard/permission.guard");
|
|
8
|
+
exports.PERMISSION_METADATA = 'permission_metadata';
|
|
9
|
+
function Permission(resource, action) {
|
|
10
|
+
return (0, common_1.applyDecorators)((0, common_1.SetMetadata)(exports.PERMISSION_METADATA, { resource, action }), (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard, permission_guard_1.PermissionGuard));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=permission.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.decorator.js","sourceRoot":"","sources":["../../../src/permission/decorator/permission.decorator.ts"],"names":[],"mappings":";;;AAMA,gCAKC;AAXD,2CAAyE;AACzE,4DAAuD;AACvD,gEAA4D;AAE/C,QAAA,mBAAmB,GAAG,qBAAqB,CAAC;AAEzD,SAAgB,UAAU,CAAC,QAAgB,EAAE,MAAc;IACzD,OAAO,IAAA,wBAAe,EACpB,IAAA,oBAAW,EAAC,2BAAmB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EACtD,IAAA,kBAAS,EAAC,6BAAY,EAAE,kCAAe,CAAC,CACzC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const User: (...dataOrPipes: unknown[]) => ParameterDecorator;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.User = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
exports.User = (0, common_1.createParamDecorator)((data, ctx) => {
|
|
6
|
+
const request = ctx.switchToHttp().getRequest();
|
|
7
|
+
return request.user;
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=user.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.decorator.js","sourceRoot":"","sources":["../../../src/permission/decorator/user.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AAE3D,QAAA,IAAI,GAAG,IAAA,6BAAoB,EACtC,CAAC,IAAa,EAAE,GAAqB,EAAE,EAAE;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAChD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.JwtAuthGuard = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const passport_1 = require("@nestjs/passport");
|
|
12
|
+
let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)('jwt') {
|
|
13
|
+
};
|
|
14
|
+
exports.JwtAuthGuard = JwtAuthGuard;
|
|
15
|
+
exports.JwtAuthGuard = JwtAuthGuard = __decorate([
|
|
16
|
+
(0, common_1.Injectable)()
|
|
17
|
+
], JwtAuthGuard);
|
|
18
|
+
//# sourceMappingURL=jwt-auth.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-auth.guard.js","sourceRoot":"","sources":["../../../src/permission/guard/jwt-auth.guard.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,+CAA6C;AAGtC,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,IAAA,oBAAS,EAAC,KAAK,CAAC;CAAG,CAAA;AAAxC,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;GACA,YAAY,CAA4B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { LoggerAppService } from '../../logger/logger.service';
|
|
4
|
+
export declare class PermissionGuard implements CanActivate {
|
|
5
|
+
private readonly reflector;
|
|
6
|
+
private readonly logger;
|
|
7
|
+
constructor(reflector: Reflector, logger: LoggerAppService);
|
|
8
|
+
canActivate(context: ExecutionContext): boolean;
|
|
9
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PermissionGuard = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const core_1 = require("@nestjs/core");
|
|
15
|
+
const logger_service_1 = require("../../logger/logger.service");
|
|
16
|
+
const permission_decorator_1 = require("../decorator/permission.decorator");
|
|
17
|
+
const permission_map_1 = require("../permission.map");
|
|
18
|
+
let PermissionGuard = class PermissionGuard {
|
|
19
|
+
constructor(reflector, logger) {
|
|
20
|
+
this.reflector = reflector;
|
|
21
|
+
this.logger = logger;
|
|
22
|
+
}
|
|
23
|
+
canActivate(context) {
|
|
24
|
+
const { resource, action } = this.reflector.get(permission_decorator_1.PERMISSION_METADATA, context.getHandler()) || {};
|
|
25
|
+
if (!resource || !action)
|
|
26
|
+
return true;
|
|
27
|
+
const request = context.switchToHttp().getRequest();
|
|
28
|
+
const user = request.user;
|
|
29
|
+
if (!(user === null || user === void 0 ? void 0 : user.permissions)) {
|
|
30
|
+
this.logger.warn(`Aucune permission trouvée pour l'utilisateur`);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const perm = user.permissions.find((p) => p.slug === resource);
|
|
34
|
+
if (!perm) {
|
|
35
|
+
this.logger.warn(`Permission manquante : ${resource}`);
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
const ownBit = permission_map_1.ACTION_BITS[`${action}:own`];
|
|
39
|
+
const allBit = permission_map_1.ACTION_BITS[`${action}:all`];
|
|
40
|
+
const authorized = (perm.bitmask & ownBit) === ownBit ||
|
|
41
|
+
(perm.bitmask & allBit) === allBit;
|
|
42
|
+
if (!authorized)
|
|
43
|
+
this.logger.warn(`Accès refusé à ${resource}:${action}`);
|
|
44
|
+
return authorized;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
exports.PermissionGuard = PermissionGuard;
|
|
48
|
+
exports.PermissionGuard = PermissionGuard = __decorate([
|
|
49
|
+
(0, common_1.Injectable)(),
|
|
50
|
+
__metadata("design:paramtypes", [core_1.Reflector,
|
|
51
|
+
logger_service_1.LoggerAppService])
|
|
52
|
+
], PermissionGuard);
|
|
53
|
+
//# sourceMappingURL=permission.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.guard.js","sourceRoot":"","sources":["../../../src/permission/guard/permission.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,2CAIwB;AACxB,uCAAyC;AACzC,gEAA+D;AAC/D,4EAAwE;AACxE,sDAAgD;AAIzC,IAAM,eAAe,GAArB,MAAM,eAAe;IAC1B,YACmB,SAAoB,EACpB,MAAwB;QADxB,cAAS,GAAT,SAAS,CAAW;QACpB,WAAM,GAAN,MAAM,CAAkB;IACxC,CAAC;IAEJ,WAAW,CAAC,OAAyB;QACnC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAChB,0CAAmB,EACnB,OAAO,CAAC,UAAU,EAAE,CACrB,IAAI,EAAE,CAAC;QAER,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEtC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAE1B,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,CAAA,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAChC,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAC9C,CAAC;QAEF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,4BAAW,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,4BAAW,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;QAE5C,MAAM,UAAU,GACd,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,MAAM;YAClC,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC;QAErC,IAAI,CAAC,UAAU;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,QAAQ,IAAI,MAAM,EAAE,CAAC,CAAC;QAE3D,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAA;AA5CY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAGmB,gBAAS;QACZ,iCAAgB;GAHhC,eAAe,CA4C3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-key.interface.js","sourceRoot":"","sources":["../../../src/permission/interfaces/jwt-key.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.interface.js","sourceRoot":"","sources":["../../../src/permission/interfaces/payload.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-decoded.interface.js","sourceRoot":"","sources":["../../../src/permission/interfaces/permission-decoded.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-encoded.interface.js","sourceRoot":"","sources":["../../../src/permission/interfaces/permission-encoded.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentinel-permission-options.interface.js","sourceRoot":"","sources":["../../../src/permission/interfaces/sentinel-permission-options.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ACTION_BITS: Record<string, number>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ACTION_BITS = void 0;
|
|
4
|
+
exports.ACTION_BITS = {
|
|
5
|
+
'create:all': 0b00000001,
|
|
6
|
+
'update:own': 0b00000010,
|
|
7
|
+
'update:all': 0b00000100,
|
|
8
|
+
'read:own': 0b00001000,
|
|
9
|
+
'read:all': 0b00010000,
|
|
10
|
+
'delete:own': 0b00100000,
|
|
11
|
+
'delete:all': 0b01000000,
|
|
12
|
+
'manage:all': 0b10000000,
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=permission.map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.map.js","sourceRoot":"","sources":["../../src/permission/permission.map.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAA2B;IAEjD,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,UAAU;IACxB,UAAU,EAAE,UAAU;IACtB,UAAU,EAAE,UAAU;IACtB,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,UAAU;CAEzB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { SentinelPermissionOptions } from "./interfaces/sentinel-permission-options.interface";
|
|
3
|
+
export declare class SentinelPermissionModule {
|
|
4
|
+
static forRootAsync(options: {
|
|
5
|
+
useFactory: (...args: any[]) => Promise<SentinelPermissionOptions> | SentinelPermissionOptions;
|
|
6
|
+
inject?: any[];
|
|
7
|
+
}): DynamicModule;
|
|
8
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
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 SentinelPermissionModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SentinelPermissionModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const jwt_strategy_1 = require("./strategy/jwt.strategy");
|
|
13
|
+
const sentinel_permission_service_1 = require("./services/permission/sentinel-permission.service");
|
|
14
|
+
const key_service_1 = require("./services/key/key.service");
|
|
15
|
+
let SentinelPermissionModule = SentinelPermissionModule_1 = class SentinelPermissionModule {
|
|
16
|
+
static forRootAsync(options) {
|
|
17
|
+
return {
|
|
18
|
+
module: SentinelPermissionModule_1,
|
|
19
|
+
global: true,
|
|
20
|
+
providers: [
|
|
21
|
+
{
|
|
22
|
+
provide: 'SENTINEL_PERMISSION_OPTIONS',
|
|
23
|
+
useFactory: options.useFactory,
|
|
24
|
+
inject: options.inject || [],
|
|
25
|
+
},
|
|
26
|
+
jwt_strategy_1.JwtStrategy,
|
|
27
|
+
sentinel_permission_service_1.SentinelPermissionService,
|
|
28
|
+
],
|
|
29
|
+
exports: [jwt_strategy_1.JwtStrategy, sentinel_permission_service_1.SentinelPermissionService],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.SentinelPermissionModule = SentinelPermissionModule;
|
|
34
|
+
exports.SentinelPermissionModule = SentinelPermissionModule = SentinelPermissionModule_1 = __decorate([
|
|
35
|
+
(0, common_1.Module)({
|
|
36
|
+
providers: [key_service_1.KeyService],
|
|
37
|
+
})
|
|
38
|
+
], SentinelPermissionModule);
|
|
39
|
+
//# sourceMappingURL=sentinel-permission.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentinel-permission.module.js","sourceRoot":"","sources":["../../src/permission/sentinel-permission.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,0DAAoD;AACpD,mGAA4F;AAE5F,4DAAwD;AAMjD,IAAM,wBAAwB,gCAA9B,MAAM,wBAAwB;IACnC,MAAM,CAAC,YAAY,CAAC,OAGnB;QACC,OAAO;YACL,MAAM,EAAE,0BAAwB;YAChC,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,6BAA6B;oBACtC,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;iBAC7B;gBACD,0BAAW;gBACX,uDAAyB;aAC1B;YACD,OAAO,EAAE,CAAC,0BAAW,EAAE,uDAAyB,CAAC;SAClD,CAAC;IACJ,CAAC;CACF,CAAA;AApBY,4DAAwB;mCAAxB,wBAAwB;IAHpC,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,wBAAU,CAAC;KACxB,CAAC;GACW,wBAAwB,CAoBpC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SentinelPermissionOptions } from '../../interfaces/sentinel-permission-options.interface';
|
|
2
|
+
export declare class KeyService {
|
|
3
|
+
private readonly options;
|
|
4
|
+
private cache;
|
|
5
|
+
constructor(options: SentinelPermissionOptions);
|
|
6
|
+
getPublicKey(kid?: string): Promise<string>;
|
|
7
|
+
private getLocalPublicKey;
|
|
8
|
+
private getRemotePublicKey;
|
|
9
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.KeyService = void 0;
|
|
19
|
+
const common_1 = require("@nestjs/common");
|
|
20
|
+
const path_1 = __importDefault(require("path"));
|
|
21
|
+
const promises_1 = require("fs/promises");
|
|
22
|
+
const axios_1 = __importDefault(require("axios"));
|
|
23
|
+
const jwk_to_pem_1 = __importDefault(require("jwk-to-pem"));
|
|
24
|
+
let KeyService = class KeyService {
|
|
25
|
+
constructor(options) {
|
|
26
|
+
this.options = options;
|
|
27
|
+
this.cache = new Map();
|
|
28
|
+
}
|
|
29
|
+
async getPublicKey(kid) {
|
|
30
|
+
if (this.options.mode === 'local') {
|
|
31
|
+
return this.getLocalPublicKey();
|
|
32
|
+
}
|
|
33
|
+
else if (this.options.mode === 'remote') {
|
|
34
|
+
return this.getRemotePublicKey(kid);
|
|
35
|
+
}
|
|
36
|
+
throw new common_1.InternalServerErrorException('Invalid Sentinel mode');
|
|
37
|
+
}
|
|
38
|
+
async getLocalPublicKey() {
|
|
39
|
+
try {
|
|
40
|
+
const filePath = path_1.default.resolve(process.cwd(), 'keys/public.pem');
|
|
41
|
+
return await (0, promises_1.readFile)(filePath, 'utf-8');
|
|
42
|
+
}
|
|
43
|
+
catch (_a) {
|
|
44
|
+
throw new common_1.InternalServerErrorException('Impossible de lire la clé publique locale');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async getRemotePublicKey(kid) {
|
|
48
|
+
var _a;
|
|
49
|
+
if (!this.options.apiSentinel) {
|
|
50
|
+
throw new common_1.InternalServerErrorException('apiSentinel non défini pour le mode remote');
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const url = `${this.options.apiSentinel}/.well-known/jwks.json`;
|
|
54
|
+
const { data } = await axios_1.default.get(url, { timeout: 5000 });
|
|
55
|
+
if (!((_a = data === null || data === void 0 ? void 0 : data.keys) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
56
|
+
throw new Error('Aucune clé trouvée dans le JWKS');
|
|
57
|
+
}
|
|
58
|
+
const key = kid ? data.keys.find((k) => k.kid === kid) : data.keys[0];
|
|
59
|
+
if (!key) {
|
|
60
|
+
throw new Error(`Aucune clé correspondant au kid "${kid}"`);
|
|
61
|
+
}
|
|
62
|
+
if (!key.n || !key.e) {
|
|
63
|
+
console.error('Clé JWK invalide:', key);
|
|
64
|
+
throw new Error('Clé JWK incomplète (n ou e manquant)');
|
|
65
|
+
}
|
|
66
|
+
const pem = (0, jwk_to_pem_1.default)(key);
|
|
67
|
+
if (key.kid) {
|
|
68
|
+
this.cache.set(key.kid, pem);
|
|
69
|
+
setTimeout(() => this.cache.delete(key.kid), 15 * 60 * 1000);
|
|
70
|
+
}
|
|
71
|
+
return pem;
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
console.error('Erreur lors du chargement du JWKS :', e.message);
|
|
75
|
+
throw new common_1.InternalServerErrorException('Impossible de récupérer la clé distante');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
exports.KeyService = KeyService;
|
|
80
|
+
exports.KeyService = KeyService = __decorate([
|
|
81
|
+
(0, common_1.Injectable)(),
|
|
82
|
+
__param(0, (0, common_1.Inject)('SENTINEL_PERMISSION_OPTIONS')),
|
|
83
|
+
__metadata("design:paramtypes", [Object])
|
|
84
|
+
], KeyService);
|
|
85
|
+
//# sourceMappingURL=key.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.service.js","sourceRoot":"","sources":["../../../../src/permission/services/key/key.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const testing_1 = require("@nestjs/testing");
|
|
4
|
+
const key_service_1 = require("./key.service");
|
|
5
|
+
describe('KeyService', () => {
|
|
6
|
+
let service;
|
|
7
|
+
beforeEach(async () => {
|
|
8
|
+
const module = await testing_1.Test.createTestingModule({
|
|
9
|
+
providers: [key_service_1.KeyService],
|
|
10
|
+
}).compile();
|
|
11
|
+
service = module.get(key_service_1.KeyService);
|
|
12
|
+
});
|
|
13
|
+
it('should be defined', () => {
|
|
14
|
+
expect(service).toBeDefined();
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=key.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.service.spec.js","sourceRoot":"","sources":["../../../../src/permission/services/key/key.service.spec.ts"],"names":[],"mappings":";;AAAA,6CAAsD;AACtD,+CAA2C;AAE3C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,OAAmB,CAAC;IAExB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,SAAS,EAAE,CAAC,wBAAU,CAAC;SACxB,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,OAAO,GAAG,MAAM,CAAC,GAAG,CAAa,wBAAU,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PermissionDecoded } from "../../interfaces/permission-decoded.interface";
|
|
2
|
+
import { PermissionEncoded } from "../../interfaces/permission-encoded.interface";
|
|
3
|
+
export declare class SentinelPermissionService {
|
|
4
|
+
encodePermissionCode(permissionsList: PermissionDecoded[]): Promise<PermissionEncoded[]>;
|
|
5
|
+
decodePermissionCode(code: number): string[];
|
|
6
|
+
hasPermission(user: any, resource: string, action: string): 'all' | 'own' | false;
|
|
7
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SentinelPermissionService = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const permission_map_1 = require("../../permission.map");
|
|
12
|
+
let SentinelPermissionService = class SentinelPermissionService {
|
|
13
|
+
async encodePermissionCode(permissionsList) {
|
|
14
|
+
const maxBit = 8;
|
|
15
|
+
const result = {};
|
|
16
|
+
for (const perm of permissionsList) {
|
|
17
|
+
const [resource] = perm.slug.split(':');
|
|
18
|
+
if (!result[resource]) {
|
|
19
|
+
result[resource] = Array(maxBit).fill(0);
|
|
20
|
+
}
|
|
21
|
+
const index = Math.log2(perm.bitValue);
|
|
22
|
+
result[resource][maxBit - index - 1] = 1;
|
|
23
|
+
}
|
|
24
|
+
return Object.entries(result).map(([slug, bits]) => ({
|
|
25
|
+
slug,
|
|
26
|
+
bitmask: parseInt(bits.join(''), 2)
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
decodePermissionCode(code) {
|
|
30
|
+
return Object.entries(permission_map_1.ACTION_BITS)
|
|
31
|
+
.filter(([_, bit]) => (code & bit) === bit)
|
|
32
|
+
.map(([action]) => action);
|
|
33
|
+
}
|
|
34
|
+
hasPermission(user, resource, action) {
|
|
35
|
+
var _a;
|
|
36
|
+
const perm = (_a = user === null || user === void 0 ? void 0 : user.permissions) === null || _a === void 0 ? void 0 : _a.find((p) => p.slug === resource);
|
|
37
|
+
if (!perm)
|
|
38
|
+
return false;
|
|
39
|
+
const ownBit = permission_map_1.ACTION_BITS[`${action}:own`];
|
|
40
|
+
const allBit = permission_map_1.ACTION_BITS[`${action}:all`];
|
|
41
|
+
if ((perm.bitmask & allBit) === allBit) {
|
|
42
|
+
return 'all';
|
|
43
|
+
}
|
|
44
|
+
if ((perm.bitmask & ownBit) === ownBit) {
|
|
45
|
+
return 'own';
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
exports.SentinelPermissionService = SentinelPermissionService;
|
|
51
|
+
exports.SentinelPermissionService = SentinelPermissionService = __decorate([
|
|
52
|
+
(0, common_1.Injectable)()
|
|
53
|
+
], SentinelPermissionService);
|
|
54
|
+
//# sourceMappingURL=sentinel-permission.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentinel-permission.service.js","sourceRoot":"","sources":["../../../../src/permission/services/permission/sentinel-permission.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA0C;AAG1C,yDAAiD;AAG1C,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAEpC,KAAK,CAAC,oBAAoB,CAAC,eAAoC;QAC7D,MAAM,MAAM,GAAG,CAAC,CAAC;QACjB,MAAM,MAAM,GAA6B,EAAE,CAAC;QAE5C,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI;YACJ,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACpC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,oBAAoB,CAAC,IAAY;QAC/B,OAAO,MAAM,CAAC,OAAO,CAAC,4BAAW,CAAC;aAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC;aAC1C,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,IAAS,EAAE,QAAgB,EAAE,MAAc;;QACvD,MAAM,IAAI,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,0CAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAExB,MAAM,MAAM,GAAG,4BAAW,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,4BAAW,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;QAE5C,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AA9CY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;GACA,yBAAyB,CA8CrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const testing_1 = require("@nestjs/testing");
|
|
4
|
+
const sentinel_permission_service_1 = require("./sentinel-permission.service");
|
|
5
|
+
describe('SentinelPermissionService', () => {
|
|
6
|
+
let service;
|
|
7
|
+
beforeEach(async () => {
|
|
8
|
+
const module = await testing_1.Test.createTestingModule({
|
|
9
|
+
providers: [sentinel_permission_service_1.SentinelPermissionService],
|
|
10
|
+
}).compile();
|
|
11
|
+
service = module.get(sentinel_permission_service_1.SentinelPermissionService);
|
|
12
|
+
});
|
|
13
|
+
it('should be defined', () => {
|
|
14
|
+
expect(service).toBeDefined();
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=sentinel-permission.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentinel-permission.service.spec.js","sourceRoot":"","sources":["../../../../src/permission/services/permission/sentinel-permission.service.spec.ts"],"names":[],"mappings":";;AAAA,6CAAsD;AACtD,+EAA0E;AAE1E,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,OAAkC,CAAC;IAEvC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,SAAS,EAAE,CAAC,uDAAyB,CAAC;SACvC,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,OAAO,GAAG,MAAM,CAAC,GAAG,CAA4B,uDAAyB,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Strategy } from 'passport-jwt';
|
|
2
|
+
import { KeyService } from '../services/key/key.service';
|
|
3
|
+
import { Payload } from '../interfaces/payload.interface';
|
|
4
|
+
import { LoggerAppService } from '../../logger/logger.service';
|
|
5
|
+
declare const JwtStrategy_base: new (...args: [opt: import("passport-jwt").StrategyOptionsWithRequest] | [opt: import("passport-jwt").StrategyOptionsWithoutRequest]) => Strategy & {
|
|
6
|
+
validate(...args: any[]): unknown;
|
|
7
|
+
};
|
|
8
|
+
export declare class JwtStrategy extends JwtStrategy_base {
|
|
9
|
+
private readonly keyService;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
constructor(keyService: KeyService, logger: LoggerAppService);
|
|
12
|
+
validate(payload: Payload): Promise<{
|
|
13
|
+
userId: string;
|
|
14
|
+
username: string;
|
|
15
|
+
site: string;
|
|
16
|
+
permissions: import("../interfaces/permission-encoded.interface").PermissionEncoded[];
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
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;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.JwtStrategy = void 0;
|
|
46
|
+
const common_1 = require("@nestjs/common");
|
|
47
|
+
const passport_1 = require("@nestjs/passport");
|
|
48
|
+
const passport_jwt_1 = require("passport-jwt");
|
|
49
|
+
const jwt = __importStar(require("jsonwebtoken"));
|
|
50
|
+
const key_service_1 = require("../services/key/key.service");
|
|
51
|
+
const logger_service_1 = require("../../logger/logger.service");
|
|
52
|
+
let JwtStrategy = class JwtStrategy extends (0, passport_1.PassportStrategy)(passport_jwt_1.Strategy) {
|
|
53
|
+
constructor(keyService, logger) {
|
|
54
|
+
const algorithm = 'RS256';
|
|
55
|
+
super({
|
|
56
|
+
jwtFromRequest: passport_jwt_1.ExtractJwt.fromAuthHeaderAsBearerToken(),
|
|
57
|
+
ignoreExpiration: false,
|
|
58
|
+
algorithms: [algorithm],
|
|
59
|
+
secretOrKeyProvider: async (request, rawJwtToken, done) => {
|
|
60
|
+
var _a;
|
|
61
|
+
try {
|
|
62
|
+
const decoded = jwt.decode(rawJwtToken, { complete: true });
|
|
63
|
+
if (!((_a = decoded === null || decoded === void 0 ? void 0 : decoded.header) === null || _a === void 0 ? void 0 : _a.kid)) {
|
|
64
|
+
this.logger.warn('Token reçu sans kid → rejeté');
|
|
65
|
+
return done(new common_1.UnauthorizedException('Token sans identifiant de clé'));
|
|
66
|
+
}
|
|
67
|
+
const kid = decoded.header.kid;
|
|
68
|
+
this.logger.debug(`Vérification du token avec kid=${kid}`);
|
|
69
|
+
const publicKey = await this.keyService.getPublicKey(kid);
|
|
70
|
+
if (!publicKey) {
|
|
71
|
+
this.logger.log(`Aucune clé publique trouvée pour kid=${kid}`);
|
|
72
|
+
return done(new common_1.UnauthorizedException('Clé publique introuvable'));
|
|
73
|
+
}
|
|
74
|
+
this.logger.log(`Clé publique trouvée pour kid=${kid}`);
|
|
75
|
+
done(null, publicKey);
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
this.logger.error(`Erreur interne lors du chargement de la clé : ${e.message}`, e.stack);
|
|
79
|
+
done(new common_1.UnauthorizedException('Erreur lors de la récupération de la clé'));
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
this.keyService = keyService;
|
|
84
|
+
this.logger = logger;
|
|
85
|
+
this.logger.log('JwtStrategy initialisée');
|
|
86
|
+
}
|
|
87
|
+
async validate(payload) {
|
|
88
|
+
this.logger.log(`Token valide pour user=${payload.username} site=${payload.site}`);
|
|
89
|
+
return {
|
|
90
|
+
userId: payload.userId,
|
|
91
|
+
username: payload.username,
|
|
92
|
+
site: payload.site,
|
|
93
|
+
permissions: payload.permissions,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
exports.JwtStrategy = JwtStrategy;
|
|
98
|
+
exports.JwtStrategy = JwtStrategy = __decorate([
|
|
99
|
+
(0, common_1.Injectable)(),
|
|
100
|
+
__metadata("design:paramtypes", [key_service_1.KeyService,
|
|
101
|
+
logger_service_1.LoggerAppService])
|
|
102
|
+
], JwtStrategy);
|
|
103
|
+
//# sourceMappingURL=jwt.strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../../src/permission/strategy/jwt.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAGwB;AACxB,+CAAoD;AACpD,+CAAoD;AACpD,kDAAoC;AAEpC,6DAAyD;AAEzD,gEAA+D;AAGxD,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,IAAA,2BAAgB,EAAC,uBAAQ,CAAC;IACzD,YACmB,UAAsB,EACtB,MAAwB;QAEzC,MAAM,SAAS,GAAc,OAAO,CAAC;QAErC,KAAK,CAAC;YACJ,cAAc,EAAE,yBAAU,CAAC,2BAA2B,EAAE;YACxD,gBAAgB,EAAE,KAAK;YACvB,UAAU,EAAE,CAAC,SAAS,CAAC;YACvB,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;;gBACxD,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC5D,IAAI,CAAC,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,GAAG,CAAA,EAAE,CAAC;wBAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;wBACjD,OAAO,IAAI,CAAC,IAAI,8BAAqB,CAAC,+BAA+B,CAAC,CAAC,CAAC;oBAC1E,CAAC;oBAED,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;oBAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;oBAE3D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;oBAC1D,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;wBAC/D,OAAO,IAAI,CAAC,IAAI,8BAAqB,CAAC,0BAA0B,CAAC,CAAC,CAAC;oBACrE,CAAC;oBAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;oBAExD,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACxB,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAE,CAAC;oBAC1F,IAAI,CAAC,IAAI,8BAAqB,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAlCc,eAAU,GAAV,UAAU,CAAY;QACtB,WAAM,GAAN,MAAM,CAAkB;QAmCzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAgB;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,QAAQ,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAEnF,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC;IACJ,CAAC;CACF,CAAA;AAnDY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAGoB,wBAAU;QACd,iCAAgB;GAHhC,WAAW,CAmDvB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { SentinelPermissionOptions } from './permission/interfaces/sentinel-permission-options.interface';
|
|
3
|
+
export declare class SentinelCoreModule {
|
|
4
|
+
static forRootAsync(options: {
|
|
5
|
+
useFactory: (...args: any[]) => Promise<SentinelPermissionOptions> | SentinelPermissionOptions;
|
|
6
|
+
inject?: any[];
|
|
7
|
+
}): DynamicModule;
|
|
8
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
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 SentinelCoreModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SentinelCoreModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const logger_module_1 = require("./logger/logger.module");
|
|
13
|
+
const sentinel_permission_module_1 = require("./permission/sentinel-permission.module");
|
|
14
|
+
let SentinelCoreModule = SentinelCoreModule_1 = class SentinelCoreModule {
|
|
15
|
+
static forRootAsync(options) {
|
|
16
|
+
return {
|
|
17
|
+
module: SentinelCoreModule_1,
|
|
18
|
+
imports: [
|
|
19
|
+
logger_module_1.LoggerModule,
|
|
20
|
+
sentinel_permission_module_1.SentinelPermissionModule.forRootAsync(options),
|
|
21
|
+
],
|
|
22
|
+
exports: [logger_module_1.LoggerModule, sentinel_permission_module_1.SentinelPermissionModule],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.SentinelCoreModule = SentinelCoreModule;
|
|
27
|
+
exports.SentinelCoreModule = SentinelCoreModule = SentinelCoreModule_1 = __decorate([
|
|
28
|
+
(0, common_1.Global)(),
|
|
29
|
+
(0, common_1.Module)({})
|
|
30
|
+
], SentinelCoreModule);
|
|
31
|
+
//# sourceMappingURL=sentinel-nest-core.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentinel-nest-core.module.js","sourceRoot":"","sources":["../src/sentinel-nest-core.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+D;AAC/D,0DAAsD;AACtD,wFAAmF;AAK5E,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAC7B,MAAM,CAAC,YAAY,CAAC,OAGnB;QACC,OAAO;YACL,MAAM,EAAE,oBAAkB;YAC1B,OAAO,EAAE;gBACP,4BAAY;gBACZ,qDAAwB,CAAC,YAAY,CAAC,OAAO,CAAC;aAC/C;YACD,OAAO,EAAE,CAAC,4BAAY,EAAE,qDAAwB,CAAC;SAClD,CAAC;IACJ,CAAC;CACF,CAAA;AAdY,gDAAkB;6BAAlB,kBAAkB;IAF9B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,kBAAkB,CAc9B"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sentinel-nestjs-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"types": "dist/index.d.ts",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist/**/*"
|
|
8
|
+
],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
11
|
+
"build": "nest build"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [],
|
|
14
|
+
"author": "Cedric RAYMOND",
|
|
15
|
+
"license": "ISC",
|
|
16
|
+
"description": "",
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"reflect-metadata": "^0.2.2",
|
|
19
|
+
"rxjs": "^7.8.2"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/express": "^5.0.5",
|
|
23
|
+
"@types/jest": "^30.0.0",
|
|
24
|
+
"@types/node": "^24.9.2",
|
|
25
|
+
"ts-node": "^10.9.2",
|
|
26
|
+
"typescript": "^5.9.3",
|
|
27
|
+
"@types/axios": "^0.9.36",
|
|
28
|
+
"@types/jwk-to-pem": "^2.0.3",
|
|
29
|
+
"@types/passport-jwt": "^4.0.1"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@nestjs/common": "^11.1.8",
|
|
33
|
+
"@nestjs/testing": "^11.1.6",
|
|
34
|
+
"express": "^5.1.0",
|
|
35
|
+
"winston": "^3.17.0",
|
|
36
|
+
"winston-daily-rotate-file": "^5.0.0",
|
|
37
|
+
"@nestjs/config": "^4.0.2",
|
|
38
|
+
"@nestjs/core": "^11.1.6",
|
|
39
|
+
"@nestjs/jwt": "^11.0.0",
|
|
40
|
+
"@nestjs/passport": "^11.0.5",
|
|
41
|
+
"axios": "^1.13.1",
|
|
42
|
+
"jwk-to-pem": "^2.0.7",
|
|
43
|
+
"passport-jwt": "^4.0.1"
|
|
44
|
+
}
|
|
45
|
+
}
|