v0.6.4: авто-имперсонация (ORIGINAL→TARGET) + ADMIN_EMAIL
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
module.exports = {
|
||||
version: '0.6.3',
|
||||
version: '0.6.4',
|
||||
|
||||
// ── IAM ──────────────────────────────────────────────────────────────────
|
||||
iamUrl: process.env.V2_IAM_URL || 'https://auth-api.ngcloud.ru/api/v1/auth/user',
|
||||
|
||||
@@ -1,32 +1,50 @@
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
// V2 — Расширение имперсонации (отдельный модуль)
|
||||
// V2 — Авто-имперсонация (отдельный модуль)
|
||||
//
|
||||
// ЭТО: middleware — добавляет дополнительные компании имперсонируемому юзеру.
|
||||
// НЕ: жёсткая логика в resolveContext или user/index.js.
|
||||
// УСЛОВИЯ (все три должны быть заданы):
|
||||
// IMPERSONATION_ORIGINAL = email юзера при входе (ntazetdinov@nubes.ru)
|
||||
// IMPERSONATION_TARGET = в кого имперсонировать (tazet@narod.ru)
|
||||
// IMPERSONATION_COMPANY = компания цели (WZ01325)
|
||||
//
|
||||
// ENV:
|
||||
// IMPERSONATION_TARGET — email юзера, которому добавляем компании
|
||||
// IMPERSONATION_EXTRA_COMPANIES — W-номера через запятую (WZ01112,WZ03709)
|
||||
// ОПЦИОНАЛЬНО:
|
||||
// IMPERSONATION_EXTRA_COMPANIES = доп. компании через запятую (WZ01112)
|
||||
//
|
||||
// ЧТО ДЕЛАЕТ:
|
||||
// Когда юзер с email === ORIGINAL входит → сессия подменяется:
|
||||
// email → TARGET
|
||||
// clientId → COMPANY
|
||||
// allClientIds → [COMPANY, EXTRA_COMPANIES]
|
||||
// isImpersonated → true
|
||||
// originalUserEmail → ORIGINAL
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
const TARGET_EMAIL = process.env.IMPERSONATION_TARGET || '';
|
||||
const EXTRA_COMPANIES = (process.env.IMPERSONATION_EXTRA_COMPANIES || '')
|
||||
const ORIGINAL = process.env.IMPERSONATION_ORIGINAL || '';
|
||||
const TARGET = process.env.IMPERSONATION_TARGET || '';
|
||||
const COMPANY = process.env.IMPERSONATION_COMPANY || '';
|
||||
const EXTRA = (process.env.IMPERSONATION_EXTRA_COMPANIES || '')
|
||||
.split(',').map(s => s.trim()).filter(Boolean);
|
||||
|
||||
// Все три обязательны
|
||||
const ENABLED = ORIGINAL && TARGET && COMPANY;
|
||||
|
||||
function enhanceImpersonation(req, res, next) {
|
||||
if (!TARGET_EMAIL) return next();
|
||||
if (!ENABLED) return next();
|
||||
|
||||
const u = req.session && req.session.user;
|
||||
if (!u || u.email !== TARGET_EMAIL) return next();
|
||||
if (!u || u.email !== ORIGINAL) return next();
|
||||
|
||||
const current = u.allClientIds || [u.clientId || ''];
|
||||
u.allClientIds = [...new Set([...current, ...EXTRA_COMPANIES])].filter(Boolean);
|
||||
// Подмена сессии — авто-имперсонация
|
||||
const allCids = [COMPANY, ...EXTRA];
|
||||
u.originalUserEmail = ORIGINAL; // кто реально вошёл
|
||||
u.email = TARGET; // в кого имперсонируем
|
||||
u.clientId = COMPANY;
|
||||
u.activeClientId = COMPANY;
|
||||
u.allClientIds = allCids;
|
||||
u.isImpersonated = true;
|
||||
u.companyName = COMPANY;
|
||||
u.profiles = allCids.map(cid => ({ client_id: cid, company_name: cid }));
|
||||
|
||||
if (!u.profiles) u.profiles = [];
|
||||
for (const cid of EXTRA_COMPANIES) {
|
||||
if (!u.profiles.find(p => p.client_id === cid))
|
||||
u.profiles.push({ client_id: cid, company_name: cid, is_active_profile: false });
|
||||
}
|
||||
next();
|
||||
}
|
||||
|
||||
module.exports = { enhanceImpersonation, TARGET_EMAIL, EXTRA_COMPANIES };
|
||||
module.exports = { enhanceImpersonation };
|
||||
|
||||
@@ -35,12 +35,13 @@ function resolveContext(req, res, next) {
|
||||
// Имперсонация: админ действует от имени компании
|
||||
// u.originalUserEmail — реальный админ
|
||||
// u.impersonatedCompanyId — W-номер компании
|
||||
const ADMIN_EMAIL = process.env.ADMIN_EMAIL || '';
|
||||
const isImpersonated = !!(u.originalUserEmail && u.impersonatedCompanyId);
|
||||
|
||||
req.email = isImpersonated ? u.originalUserEmail : (u.email || '');
|
||||
req.clientId = isImpersonated ? u.impersonatedCompanyId : (u.activeClientId || u.clientId || '');
|
||||
req.companyName = u.companyName || req.clientId;
|
||||
req.isAdmin = !!(u.isAdmin && u.adminMode);
|
||||
req.isAdmin = !!(u.isAdmin && u.adminMode) || (ADMIN_EMAIL && u.email === ADMIN_EMAIL);
|
||||
req.isImpersonated = isImpersonated;
|
||||
req.impersonatedBy = isImpersonated ? u.email : null;
|
||||
req.allClientIds = u.allClientIds || [req.clientId];
|
||||
|
||||
Reference in New Issue
Block a user