/api/user
This commit is contained in:
55
auth.js
55
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,
|
||||
|
||||
42
server.js
42
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}`);
|
||||
|
||||
Reference in New Issue
Block a user