/api/user

This commit is contained in:
2026-02-01 22:03:01 +05:00
parent f0da850116
commit 3937377f94
2 changed files with 81 additions and 16 deletions

55
auth.js
View File

@@ -180,15 +180,50 @@ class AuthService {
const { username, full_name, groups, description } = ldapData; const { username, full_name, groups, description } = ldapData;
// Определяем роль пользователя на основе групп // Определяем роль пользователя на основе групп
// Получаем все группы из .env
const allowedGroups = process.env.ALLOWED_GROUPS ? const allowedGroups = process.env.ALLOWED_GROUPS ?
process.env.ALLOWED_GROUPS.split(',').map(g => g.trim()) : []; process.env.ALLOWED_GROUPS.split(',').map(g => g.trim()) : [];
// ВАЖНО: Проверяем актуальные группы при каждом входе const secretaryGroups = process.env.SECRETARY_GROUPS ?
const isAdmin = groups && groups.some(group => process.env.SECRETARY_GROUPS.split(',').map(g => g.trim()) : [];
allowedGroups.includes(group)
);
const role = isAdmin ? 'admin' : 'teacher'; 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] : [];
// Проверяем все группы пользователя и определяем роль
// Если пользователь состоит в нескольких группах, приоритет определяется порядком проверки
let role = '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) => { return new Promise((resolve, reject) => {
@@ -202,15 +237,15 @@ class AuthService {
login: username, login: username,
name: full_name || username, name: full_name || username,
email: `${username}@school25.ru`, email: `${username}@school25.ru`,
role: role, // Всегда обновляем роль из актуальных групп role: role,
auth_type: 'ldap', auth_type: 'ldap',
groups: groups ? JSON.stringify(groups) : '[]', groups: JSON.stringify(userGroups),
description: description || '', description: description || '',
last_login: new Date().toISOString() last_login: new Date().toISOString()
}; };
if (existingUser) { if (existingUser) {
// Всегда обновляем роль, даже если пользователь уже существует // Всегда обновляем роль и группы
this.db.run( this.db.run(
`UPDATE users SET `UPDATE users SET
name = ?, email = ?, role = ?, groups = ?, description = ?, last_login = datetime('now'), name = ?, email = ?, role = ?, groups = ?, description = ?, last_login = datetime('now'),
@@ -221,7 +256,7 @@ class AuthService {
if (err) { if (err) {
reject(err); reject(err);
} else { } else {
console.log(`✅ Обновлены данные LDAP пользователя ${username}. Роль: ${userData.role}, Группы: ${groups}`); console.log(`✅ Обновлены данные LDAP пользователя ${username}. Роль: ${userData.role}, Группы: ${userGroups.length}`);
resolve({ resolve({
id: existingUser.id, id: existingUser.id,
login: userData.login, login: userData.login,
@@ -247,7 +282,7 @@ class AuthService {
if (err) { if (err) {
reject(err); reject(err);
} else { } else {
console.log(`✅ Создан новый LDAP пользователь ${username}. Роль: ${userData.role}, Группы: ${groups}`); console.log(`✅ Создан новый LDAP пользователь ${username}. Роль: ${userData.role}, Группы: ${userGroups.length}`);
resolve({ resolve({
id: this.lastID, id: this.lastID,
login: userData.login, login: userData.login,

View File

@@ -230,18 +230,48 @@ app.get('/api/user', (req, res) => {
return res.status(401).json({ error: 'Пользователь не найден' }); return res.status(401).json({ error: 'Пользователь не найден' });
} }
let groups = []; let userGroups = [];
try { try {
groups = JSON.parse(user.groups || '[]'); userGroups = JSON.parse(user.groups || '[]');
} catch (e) { } catch (e) {
groups = []; userGroups = [];
} }
// Получаем все группы из .env
const allowedGroups = process.env.ALLOWED_GROUPS ? const allowedGroups = process.env.ALLOWED_GROUPS ?
process.env.ALLOWED_GROUPS.split(',').map(g => g.trim()) : []; 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()) : [];
const isAdmin = groups.some(group => allowedGroups.includes(group)); // Определяем роль пользователя на основе групп
const actualRole = isAdmin ? 'admin' : 'teacher'; // ВСЕ пользователи являются '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) { if (req.session.user.role !== actualRole) {
console.log(`Обновлена роль пользователя ${req.session.user.login} с ${req.session.user.role} на ${actualRole}`); console.log(`Обновлена роль пользователя ${req.session.user.login} с ${req.session.user.role} на ${actualRole}`);