Skip to content

Commit 0815fdc

Browse files
refactor cors
1 parent 531ebd3 commit 0815fdc

File tree

5 files changed

+64
-55
lines changed

5 files changed

+64
-55
lines changed

src/interfaces/adminpanelConfig.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,8 @@ export interface AdminpanelConfig {
258258

259259
cors?: {
260260
enabled: boolean;
261-
origin?: string[];
261+
origin: string[] | string;
262+
path: string
262263
credentials?: boolean;
263264
methods?: string[];
264265
allowedHeaders?: string[];

src/lib/Adminizer.ts

Lines changed: 3 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {bindNotifications} from "../system/bindNotifications";
4040
import {INotification} from "../interfaces/types";
4141
import {MediaManagerHandler} from "./media-manager/MediaManagerHandler";
4242
import {StorageServices} from "./catalog/Navigation";
43+
import {bindCors} from "../system/bindCors";
4344

4445
export class Adminizer {
4546
// Preconfigures
@@ -212,60 +213,9 @@ export class Adminizer {
212213
}
213214
};
214215

215-
// Middleware для всех API маршрутов
216-
const defaultOrigin = process.env.FRONTEND_URL || 'http://localhost:8080';
216+
// Bind cors
217+
bindCors(this)
217218

218-
if (config?.cors?.enabled) {
219-
const corsConfig = config.cors;
220-
221-
// Поддерживаем массив разрешенных origin
222-
const allowedOrigins = Array.isArray(corsConfig.origin)
223-
? corsConfig.origin
224-
: [corsConfig.origin || defaultOrigin];
225-
226-
this.app.all(`${this.config.routePrefix}/api/*`, (req: any, res: any, next: any) => {
227-
const requestOrigin = req.headers.origin;
228-
229-
// Проверяем разрешен ли origin
230-
const isOriginAllowed = !requestOrigin || allowedOrigins.includes(requestOrigin);
231-
232-
233-
if (requestOrigin && !isOriginAllowed) {
234-
console.log(`❌ CORS: Blocked request from ${requestOrigin}`);
235-
236-
if (req.method === 'OPTIONS') {
237-
// Для preflight - 200 без CORS headers
238-
return res.status(200).end();
239-
} else {
240-
// Для основных запросов - ошибка
241-
return res.status(403).json({
242-
error: 'CORS policy: Origin not allowed'
243-
});
244-
}
245-
}
246-
247-
// Запрос с разрешенного origin или без Origin
248-
if (isOriginAllowed) {
249-
// Для CORS запросов возвращаем тот же origin (или первый из списка)
250-
const allowOrigin = requestOrigin || allowedOrigins[0];
251-
res.header('Access-Control-Allow-Origin', allowOrigin);
252-
res.header('Access-Control-Allow-Credentials',
253-
corsConfig.credentials !== false ? 'true' : 'false');
254-
res.header('Access-Control-Allow-Methods',
255-
corsConfig.methods?.join(',') || 'GET,POST,PUT,DELETE,OPTIONS');
256-
res.header('Access-Control-Allow-Headers',
257-
corsConfig.allowedHeaders?.join(',') || 'Content-Type,Authorization,X-Requested-With,X-CSRF-Token,x-xsrf-token');
258-
}
259-
260-
if (req.method === 'OPTIONS') {
261-
return res.status(200).end();
262-
}
263-
264-
next();
265-
});
266-
267-
console.log('✅ API CORS middleware enabled. Allowed origins:', allowedOrigins);
268-
}
269219
// set cookie parser
270220
this.app.use(cookieParser());
271221

src/system/Router.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ export default class Router {
8686
* */
8787
adminizer.app.all(`${adminizer.config.routePrefix}/form/:slug`, adminizer.policyManager.bindPolicies(policies, _form));
8888

89-
// Create a base entity route
89+
/**
90+
* Create a base entity route
91+
*/
9092
let baseRoute = `${adminizer.config.routePrefix}/:entityType(form|model)/:entityName`;
9193

9294
/**

src/system/bindCors.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import {Adminizer} from "../lib/Adminizer";
2+
3+
export function bindCors(adminizer: Adminizer){
4+
if (adminizer.config?.cors?.enabled) {
5+
const corsConfig = adminizer.config.cors;
6+
7+
// Поддерживаем массив разрешенных origin
8+
const allowedOrigins = Array.isArray(corsConfig.origin)
9+
? corsConfig.origin
10+
: [corsConfig.origin];
11+
12+
this.app.all(`${adminizer.config.routePrefix}/${corsConfig.path}`, (req: any, res: any, next: any) => {
13+
const requestOrigin = req.headers.origin;
14+
15+
// Проверяем разрешен ли origin
16+
const isOriginAllowed = !requestOrigin || allowedOrigins.includes(requestOrigin);
17+
18+
if (requestOrigin && !isOriginAllowed) {
19+
console.log(`❌ CORS: Blocked request from ${requestOrigin}`);
20+
21+
if (req.method === 'OPTIONS') {
22+
// Для preflight - 200 без CORS headers
23+
return res.status(200).end();
24+
} else {
25+
// Для основных запросов - ошибка
26+
return res.status(403).json({
27+
error: 'CORS policy: Origin not allowed'
28+
});
29+
}
30+
}
31+
32+
// Запрос с разрешенного origin или без Origin
33+
if (isOriginAllowed) {
34+
// Для CORS запросов возвращаем тот же origin (или первый из списка)
35+
const allowOrigin = requestOrigin || allowedOrigins[0];
36+
res.header('Access-Control-Allow-Origin', allowOrigin);
37+
res.header('Access-Control-Allow-Credentials',
38+
corsConfig.credentials !== false ? 'true' : 'false');
39+
res.header('Access-Control-Allow-Methods',
40+
corsConfig.methods?.join(',') || 'GET,POST,PUT,DELETE,OPTIONS');
41+
res.header('Access-Control-Allow-Headers',
42+
corsConfig.allowedHeaders?.join(',') || 'Content-Type,Authorization,X-Requested-With,X-CSRF-Token,x-xsrf-token');
43+
}
44+
45+
if (req.method === 'OPTIONS') {
46+
return res.status(200).end();
47+
}
48+
49+
next();
50+
});
51+
52+
console.log('✅ API CORS middleware enabled. Allowed origins:', allowedOrigins);
53+
}
54+
}

src/system/defaults.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ let adminpanelConfig: AdminpanelConfig = {
157157
},
158158
cors: {
159159
enabled: false,
160+
origin: 'http://localhost:8080',
161+
path: 'api/*'
160162
},
161163
mediamanager: {
162164
fileStoragePath: '.tmp/public',

0 commit comments

Comments
 (0)