From 3937377f941e56b62b4467bc0ab6485a8cf6d2cf Mon Sep 17 00:00:00 2001 From: kalugin66 Date: Sun, 1 Feb 2026 22:03:01 +0500 Subject: [PATCH] /api/user --- auth.js | 55 +++++++++++++++++++++++++++++++++++++++++++++---------- server.js | 42 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 81 insertions(+), 16 deletions(-) diff --git a/auth.js b/auth.js index 400c58e..4433746 100644 --- a/auth.js +++ b/auth.js @@ -180,15 +180,50 @@ class AuthService { const { username, full_name, groups, description } = ldapData; // Определяем роль пользователя на основе групп + // Получаем все группы из .env const allowedGroups = process.env.ALLOWED_GROUPS ? process.env.ALLOWED_GROUPS.split(',').map(g => g.trim()) : []; + + const secretaryGroups = process.env.SECRETARY_GROUPS ? + process.env.SECRETARY_GROUPS.split(',').map(g => g.trim()) : []; + + const helpGroups = process.env.HELP_GROUPS ? + process.env.HELP_GROUPS.split(',').map(g => g.trim()) : []; + + const itHelpGroups = process.env.ITHELP_GROUPS ? + process.env.ITHELP_GROUPS.split(',').map(g => g.trim()) : []; + + const requestGroups = process.env.REQUEST_GROUPS ? + process.env.REQUEST_GROUPS.split(',').map(g => g.trim()) : []; + + const tasksGroups = process.env.TASKS_GROUPS ? + process.env.TASKS_GROUPS.split(',').map(g => g.trim()) : []; + + // Все LDAP пользователи являются "teacher" по умолчанию + let userGroups = groups ? [...groups] : []; - // ВАЖНО: Проверяем актуальные группы при каждом входе - const isAdmin = groups && groups.some(group => - allowedGroups.includes(group) - ); + // Проверяем все группы пользователя и определяем роль + // Если пользователь состоит в нескольких группах, приоритет определяется порядком проверки + let role = 'teacher'; // Роль по умолчанию для всех пользователей - const role = isAdmin ? 'admin' : 'teacher'; + if (userGroups.length > 0) { + // Определяем наивысшую роль пользователя + // Порядок приоритета: admin > secretary > help > ithelp > request > tasks > teacher + if (userGroups.some(group => allowedGroups.includes(group))) { + role = 'admin'; + } else if (userGroups.some(group => secretaryGroups.includes(group))) { + role = 'secretary'; + } else if (userGroups.some(group => helpGroups.includes(group))) { + role = 'help'; + } else if (userGroups.some(group => itHelpGroups.includes(group))) { + role = 'ithelp'; + } else if (userGroups.some(group => requestGroups.includes(group))) { + role = 'request'; + } else if (userGroups.some(group => tasksGroups.includes(group))) { + role = 'tasks'; + } + // Если ни одна из специальных групп не найдена, остается 'teacher' + } // Сохраняем/обновляем пользователя в базе return new Promise((resolve, reject) => { @@ -202,15 +237,15 @@ class AuthService { login: username, name: full_name || username, email: `${username}@school25.ru`, - role: role, // Всегда обновляем роль из актуальных групп + role: role, auth_type: 'ldap', - groups: groups ? JSON.stringify(groups) : '[]', + groups: JSON.stringify(userGroups), description: description || '', last_login: new Date().toISOString() }; if (existingUser) { - // Всегда обновляем роль, даже если пользователь уже существует + // Всегда обновляем роль и группы this.db.run( `UPDATE users SET name = ?, email = ?, role = ?, groups = ?, description = ?, last_login = datetime('now'), @@ -221,7 +256,7 @@ class AuthService { if (err) { reject(err); } else { - console.log(`✅ Обновлены данные LDAP пользователя ${username}. Роль: ${userData.role}, Группы: ${groups}`); + console.log(`✅ Обновлены данные LDAP пользователя ${username}. Роль: ${userData.role}, Группы: ${userGroups.length}`); resolve({ id: existingUser.id, login: userData.login, @@ -247,7 +282,7 @@ class AuthService { if (err) { reject(err); } else { - console.log(`✅ Создан новый LDAP пользователь ${username}. Роль: ${userData.role}, Группы: ${groups}`); + console.log(`✅ Создан новый LDAP пользователь ${username}. Роль: ${userData.role}, Группы: ${userGroups.length}`); resolve({ id: this.lastID, login: userData.login, diff --git a/server.js b/server.js index 343a773..db43ae5 100644 --- a/server.js +++ b/server.js @@ -230,18 +230,48 @@ app.get('/api/user', (req, res) => { return res.status(401).json({ error: 'Пользователь не найден' }); } - let groups = []; + let userGroups = []; try { - groups = JSON.parse(user.groups || '[]'); + userGroups = JSON.parse(user.groups || '[]'); } catch (e) { - groups = []; + userGroups = []; } + // Получаем все группы из .env const allowedGroups = process.env.ALLOWED_GROUPS ? process.env.ALLOWED_GROUPS.split(',').map(g => g.trim()) : []; - - const isAdmin = groups.some(group => allowedGroups.includes(group)); - const actualRole = isAdmin ? 'admin' : 'teacher'; + const secretaryGroups = process.env.SECRETARY_GROUPS ? + process.env.SECRETARY_GROUPS.split(',').map(g => g.trim()) : []; + const helpGroups = process.env.HELP_GROUPS ? + process.env.HELP_GROUPS.split(',').map(g => g.trim()) : []; + const itHelpGroups = process.env.ITHELP_GROUPS ? + process.env.ITHELP_GROUPS.split(',').map(g => g.trim()) : []; + const requestGroups = process.env.REQUEST_GROUPS ? + process.env.REQUEST_GROUPS.split(',').map(g => g.trim()) : []; + const tasksGroups = process.env.TASKS_GROUPS ? + process.env.TASKS_GROUPS.split(',').map(g => g.trim()) : []; + + // Определяем роль пользователя на основе групп + // ВСЕ пользователи являются 'teacher' по умолчанию + let actualRole = 'teacher'; + if (userGroups && userGroups.length > 0) { + // Определяем наивысшую роль + // Порядок приоритета: admin > secretary > help > ithelp > request > tasks + if (userGroups.some(group => allowedGroups.includes(group))) { + actualRole = 'admin'; + } else if (userGroups.some(group => secretaryGroups.includes(group))) { + actualRole = 'secretary'; + } else if (userGroups.some(group => helpGroups.includes(group))) { + actualRole = 'help'; + } else if (userGroups.some(group => itHelpGroups.includes(group))) { + actualRole = 'ithelp'; + } else if (userGroups.some(group => requestGroups.includes(group))) { + actualRole = 'request'; + } else if (userGroups.some(group => tasksGroups.includes(group))) { + actualRole = 'tasks'; + } + // Если ни одна группа не совпала, остается 'teacher' + } if (req.session.user.role !== actualRole) { console.log(`Обновлена роль пользователя ${req.session.user.login} с ${req.session.user.role} на ${actualRole}`);