/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;
|
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,
|
||||||
|
|||||||
40
server.js
40
server.js
@@ -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}`);
|
||||||
|
|||||||
Reference in New Issue
Block a user