Add files via upload
This commit is contained in:
210
auth.js
210
auth.js
@@ -104,121 +104,123 @@ class AuthService {
|
||||
});
|
||||
}
|
||||
|
||||
async authenticateLDAP(username, password) {
|
||||
try {
|
||||
const response = await fetch(process.env.LDAP_AUTH_URL, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({ username, password })
|
||||
});
|
||||
async authenticateLDAP(username, password) {
|
||||
try {
|
||||
const response = await fetch(process.env.LDAP_AUTH_URL, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({ username, password })
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
return this.processLDAPUser(data);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('LDAP authentication error:', error);
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
return this.processLDAPUser(data);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('LDAP authentication error:', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async processLDAPUser(ldapData) {
|
||||
const { username, full_name, groups, description } = ldapData;
|
||||
|
||||
// Определяем роль пользователя на основе групп
|
||||
const allowedGroups = process.env.ALLOWED_GROUPS ?
|
||||
process.env.ALLOWED_GROUPS.split(',').map(g => g.trim()) : [];
|
||||
|
||||
const isAdmin = groups && groups.some(group =>
|
||||
allowedGroups.includes(group)
|
||||
);
|
||||
|
||||
const role = isAdmin ? 'admin' : 'teacher';
|
||||
|
||||
// Сохраняем/обновляем пользователя в базе
|
||||
return new Promise((resolve, reject) => {
|
||||
db.get("SELECT * FROM users WHERE login = ? AND auth_type = 'ldap'", [username], async (err, existingUser) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
async processLDAPUser(ldapData) {
|
||||
const { username, full_name, groups, description } = ldapData;
|
||||
|
||||
// Определяем роль пользователя на основе групп
|
||||
const allowedGroups = process.env.ALLOWED_GROUPS ?
|
||||
process.env.ALLOWED_GROUPS.split(',').map(g => g.trim()) : [];
|
||||
|
||||
// ВАЖНО: Проверяем актуальные группы при каждом входе
|
||||
const isAdmin = groups && groups.some(group =>
|
||||
allowedGroups.includes(group)
|
||||
);
|
||||
|
||||
const role = isAdmin ? 'admin' : 'teacher';
|
||||
|
||||
// Сохраняем/обновляем пользователя в базе
|
||||
return new Promise((resolve, reject) => {
|
||||
db.get("SELECT * FROM users WHERE login = ? AND auth_type = 'ldap'", [username], async (err, existingUser) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
|
||||
const userData = {
|
||||
login: username,
|
||||
name: full_name || username,
|
||||
email: `${username}@school25.ru`,
|
||||
role: role,
|
||||
auth_type: 'ldap',
|
||||
groups: groups ? JSON.stringify(groups) : '[]',
|
||||
description: description || '',
|
||||
last_login: new Date().toISOString()
|
||||
};
|
||||
const userData = {
|
||||
login: username,
|
||||
name: full_name || username,
|
||||
email: `${username}@school25.ru`,
|
||||
role: role, // Всегда обновляем роль из актуальных групп
|
||||
auth_type: 'ldap',
|
||||
groups: groups ? JSON.stringify(groups) : '[]',
|
||||
description: description || '',
|
||||
last_login: new Date().toISOString()
|
||||
};
|
||||
|
||||
if (existingUser) {
|
||||
// Обновляем существующего пользователя
|
||||
db.run(
|
||||
`UPDATE users SET
|
||||
name = ?, email = ?, role = ?, groups = ?, description = ?, last_login = datetime('now'),
|
||||
updated_at = datetime('now')
|
||||
WHERE id = ?`,
|
||||
[userData.name, userData.email, userData.role, userData.groups, userData.description, existingUser.id],
|
||||
function(err) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
// Возвращаем полные данные пользователя
|
||||
resolve({
|
||||
id: existingUser.id,
|
||||
login: userData.login,
|
||||
name: userData.name,
|
||||
email: userData.email,
|
||||
role: userData.role,
|
||||
auth_type: userData.auth_type,
|
||||
groups: userData.groups,
|
||||
description: userData.description,
|
||||
last_login: new Date().toISOString()
|
||||
});
|
||||
}
|
||||
if (existingUser) {
|
||||
// Всегда обновляем роль, даже если пользователь уже существует
|
||||
db.run(
|
||||
`UPDATE users SET
|
||||
name = ?, email = ?, role = ?, groups = ?, description = ?, last_login = datetime('now'),
|
||||
updated_at = datetime('now')
|
||||
WHERE id = ?`,
|
||||
[userData.name, userData.email, userData.role, userData.groups, userData.description, existingUser.id],
|
||||
function(err) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
console.log(`Обновлены данные LDAP пользователя ${username}. Роль: ${userData.role}, Группы: ${groups}`);
|
||||
resolve({
|
||||
id: existingUser.id,
|
||||
login: userData.login,
|
||||
name: userData.name,
|
||||
email: userData.email,
|
||||
role: userData.role,
|
||||
auth_type: userData.auth_type,
|
||||
groups: userData.groups,
|
||||
description: userData.description,
|
||||
last_login: new Date().toISOString()
|
||||
});
|
||||
}
|
||||
);
|
||||
} else {
|
||||
// Создаем нового пользователя
|
||||
db.run(
|
||||
`INSERT INTO users (login, name, email, role, auth_type, groups, description, created_at, last_login)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now'))`,
|
||||
[userData.login, userData.name, userData.email, userData.role, userData.auth_type,
|
||||
userData.groups, userData.description],
|
||||
function(err) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve({
|
||||
id: this.lastID,
|
||||
login: userData.login,
|
||||
name: userData.name,
|
||||
email: userData.email,
|
||||
role: userData.role,
|
||||
auth_type: userData.auth_type,
|
||||
groups: userData.groups,
|
||||
description: userData.description,
|
||||
last_login: new Date().toISOString()
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
} else {
|
||||
// Создаем нового пользователя
|
||||
db.run(
|
||||
`INSERT INTO users (login, name, email, role, auth_type, groups, description, created_at, last_login)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now'))`,
|
||||
[userData.login, userData.name, userData.email, userData.role, userData.auth_type,
|
||||
userData.groups, userData.description],
|
||||
function(err) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
console.log(`Создан новый LDAP пользователь ${username}. Роль: ${userData.role}, Группы: ${groups}`);
|
||||
resolve({
|
||||
id: this.lastID,
|
||||
login: userData.login,
|
||||
name: userData.name,
|
||||
email: userData.email,
|
||||
role: userData.role,
|
||||
auth_type: userData.auth_type,
|
||||
groups: userData.groups,
|
||||
description: userData.description,
|
||||
last_login: new Date().toISOString()
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async authenticate(login, password) {
|
||||
// Сначала пробуем локальную авторизацию
|
||||
|
||||
Reference in New Issue
Block a user