exguard-backend 1.1.2 → 1.1.3
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/package.json +1 -1
- package/scripts/setup.cjs +29 -33
package/package.json
CHANGED
package/scripts/setup.cjs
CHANGED
|
@@ -44,27 +44,27 @@ export class ExGuardPermissionGuard implements CanActivate {
|
|
|
44
44
|
|
|
45
45
|
const handler = context.getHandler();
|
|
46
46
|
|
|
47
|
-
const permMeta = this.reflector.get
|
|
47
|
+
const permMeta = this.reflector.get(
|
|
48
48
|
EXGUARD_PERMISSIONS_KEY,
|
|
49
49
|
handler,
|
|
50
50
|
);
|
|
51
51
|
|
|
52
52
|
if (permMeta) {
|
|
53
53
|
const { permissions, requireAll } = permMeta;
|
|
54
|
-
const userPermissions = authResult.user.modules
|
|
54
|
+
const userPermissions = authResult.user.modules ? authResult.user.modules.flatMap(m => m.permissions) : [];
|
|
55
55
|
|
|
56
56
|
if (requireAll) {
|
|
57
|
-
if (!permissions.every(
|
|
57
|
+
if (!permissions.every(p => userPermissions.includes(p))) {
|
|
58
58
|
throw new ForbiddenException('Insufficient permissions');
|
|
59
59
|
}
|
|
60
60
|
} else {
|
|
61
|
-
if (!permissions.some(
|
|
61
|
+
if (!permissions.some(p => userPermissions.includes(p))) {
|
|
62
62
|
throw new ForbiddenException('Insufficient permissions');
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
const roleMeta = this.reflector.get
|
|
67
|
+
const roleMeta = this.reflector.get(
|
|
68
68
|
EXGUARD_ROLES_KEY,
|
|
69
69
|
handler,
|
|
70
70
|
);
|
|
@@ -74,11 +74,11 @@ export class ExGuardPermissionGuard implements CanActivate {
|
|
|
74
74
|
const userRoles = authResult.user.roles || [];
|
|
75
75
|
|
|
76
76
|
if (requireAll) {
|
|
77
|
-
if (!roles.every(
|
|
77
|
+
if (!roles.every(r => userRoles.includes(r))) {
|
|
78
78
|
throw new ForbiddenException('Insufficient roles');
|
|
79
79
|
}
|
|
80
80
|
} else {
|
|
81
|
-
if (!roles.some(
|
|
81
|
+
if (!roles.some(r => userRoles.includes(r))) {
|
|
82
82
|
throw new ForbiddenException('Insufficient roles');
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -88,24 +88,24 @@ export class ExGuardPermissionGuard implements CanActivate {
|
|
|
88
88
|
return true;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
private extractToken(request
|
|
92
|
-
const auth = request.headers
|
|
93
|
-
if (auth
|
|
91
|
+
private extractToken(request) {
|
|
92
|
+
const auth = request.headers ? request.headers.authorization : null;
|
|
93
|
+
if (auth && auth.startsWith('Bearer ')) {
|
|
94
94
|
return auth.substring(7);
|
|
95
95
|
}
|
|
96
|
-
return request.headers
|
|
96
|
+
return request.headers ? request.headers['x-access-token'] : null;
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
export function RequirePermissions(permissions
|
|
101
|
-
return function (target
|
|
100
|
+
export function RequirePermissions(permissions, requireAll = false) {
|
|
101
|
+
return function (target, propertyKey, descriptor) {
|
|
102
102
|
Reflect.defineMetadata(EXGUARD_PERMISSIONS_KEY, { permissions, requireAll }, descriptor.value);
|
|
103
103
|
return descriptor;
|
|
104
104
|
};
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
export function RequireRoles(roles
|
|
108
|
-
return function (target
|
|
107
|
+
export function RequireRoles(roles, requireAll = false) {
|
|
108
|
+
return function (target, propertyKey, descriptor) {
|
|
109
109
|
Reflect.defineMetadata(EXGUARD_ROLES_KEY, { roles, requireAll }, descriptor.value);
|
|
110
110
|
return descriptor;
|
|
111
111
|
};
|
|
@@ -115,19 +115,10 @@ export function RequireRoles(roles: string[], requireAll = false): any {
|
|
|
115
115
|
const EXGUARD_MODULE_CONTENT = `import { Module, Global, DynamicModule } from '@nestjs/common';
|
|
116
116
|
import { ExGuardBackend } from 'exguard-backend';
|
|
117
117
|
|
|
118
|
-
export interface ExGuardModuleOptions {
|
|
119
|
-
baseUrl: string;
|
|
120
|
-
apiKey: string;
|
|
121
|
-
cache?: {
|
|
122
|
-
enabled?: boolean;
|
|
123
|
-
ttl?: number;
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
118
|
@Global()
|
|
128
119
|
@Module({})
|
|
129
120
|
export class ExGuardModule {
|
|
130
|
-
static forRoot(options
|
|
121
|
+
static forRoot(options) {
|
|
131
122
|
const exGuard = new ExGuardBackend({
|
|
132
123
|
baseUrl: options.baseUrl,
|
|
133
124
|
apiKey: options.apiKey,
|
|
@@ -148,17 +139,17 @@ export class ExGuardModule {
|
|
|
148
139
|
}
|
|
149
140
|
`;
|
|
150
141
|
|
|
151
|
-
function ensureDir(dirPath
|
|
142
|
+
function ensureDir(dirPath) {
|
|
152
143
|
if (!fs.existsSync(dirPath)) {
|
|
153
144
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
154
145
|
}
|
|
155
146
|
}
|
|
156
147
|
|
|
157
|
-
function writeFile(filePath
|
|
148
|
+
function writeFile(filePath, content) {
|
|
158
149
|
const dir = path.dirname(filePath);
|
|
159
150
|
ensureDir(dir);
|
|
160
151
|
fs.writeFileSync(filePath, content);
|
|
161
|
-
console.log(
|
|
152
|
+
console.log('Created: ' + filePath);
|
|
162
153
|
}
|
|
163
154
|
|
|
164
155
|
function setupNestJS() {
|
|
@@ -175,11 +166,14 @@ function setupNestJS() {
|
|
|
175
166
|
writeFile(path.join(exguardDir, 'exguard.guard.ts'), EXGUARD_GUARD_CONTENT);
|
|
176
167
|
writeFile(path.join(exguardDir, 'exguard.module.ts'), EXGUARD_MODULE_CONTENT);
|
|
177
168
|
|
|
178
|
-
console.log('
|
|
179
|
-
console.log('
|
|
169
|
+
console.log('');
|
|
170
|
+
console.log('ExGuard setup complete!');
|
|
171
|
+
console.log('');
|
|
172
|
+
console.log('Next steps:');
|
|
180
173
|
console.log('1. Add to app.module.ts:');
|
|
174
|
+
console.log('');
|
|
181
175
|
console.log(' import { ExGuardModule } from "./exguard/exguard.module";');
|
|
182
|
-
console.log('
|
|
176
|
+
console.log('');
|
|
183
177
|
console.log(' @Module({');
|
|
184
178
|
console.log(' imports: [');
|
|
185
179
|
console.log(' ExGuardModule.forRoot({');
|
|
@@ -189,9 +183,11 @@ function setupNestJS() {
|
|
|
189
183
|
console.log(' ],');
|
|
190
184
|
console.log(' })');
|
|
191
185
|
console.log(' export class AppModule {}');
|
|
192
|
-
console.log('
|
|
186
|
+
console.log('');
|
|
187
|
+
console.log('2. Use in controllers:');
|
|
188
|
+
console.log('');
|
|
193
189
|
console.log(' import { ExGuardPermissionGuard, RequirePermissions } from "@/exguard/exguard.guard";');
|
|
194
|
-
console.log('
|
|
190
|
+
console.log('');
|
|
195
191
|
console.log(' @Controller("items")');
|
|
196
192
|
console.log(' @UseGuards(ExGuardPermissionGuard)');
|
|
197
193
|
console.log(' export class ItemsController {');
|