This commit is contained in:
denis 2025-05-26 12:05:51 +07:00
parent 57fc384942
commit af70e6e986
5 changed files with 313 additions and 16 deletions

View File

@ -110,9 +110,7 @@ const loginUser = async (req, res, next) => {
if (!email || !password) { if (!email || !password) {
res.status(400); res.status(400);
throw new Error('Пожалуйста, укажите email и пароль.'); throw new Error('Пожалуйста, укажите email и пароль.');
} } // Проверяем наличие специального логина для администратора
// Проверяем наличие специального логина для администратора
if (email === 'admin') { if (email === 'admin') {
// Для логина "admin" не нормализуем email // Для логина "admin" не нормализуем email
console.log('Попытка входа с административным логином'); console.log('Попытка входа с административным логином');
@ -120,8 +118,41 @@ const loginUser = async (req, res, next) => {
if (!user) { if (!user) {
console.log('Административный аккаунт не найден в базе данных'); console.log('Административный аккаунт не найден в базе данных');
console.log('Создание административного аккаунта...');
try {
// Если админ не найден, можно попытаться создать его на месте
const adminUser = new User({
name: 'Администратор',
email: 'admin',
password: 'admin124', // Пароль будет хеширован pre-save hook
dateOfBirth: new Date('1990-01-01'),
gender: 'other',
isActive: true,
isAdmin: true,
location: {
city: 'Admin',
country: 'System'
}
});
await adminUser.save();
console.log('Административный аккаунт создан успешно');
res.status(200).json({
_id: adminUser._id,
name: adminUser.name,
email: adminUser.email,
isAdmin: true,
token: generateToken(adminUser._id),
message: 'Административный аккаунт создан. Вход выполнен успешно!'
});
return;
} catch (adminError) {
console.error('Ошибка при создании админ-аккаунта:', adminError);
res.status(401); res.status(401);
throw new Error('Неверный логин или пароль.'); throw new Error('Неверный логин или пароль. Не удалось создать админа автоматически.');
}
} }
if (!user.password) { if (!user.password) {
@ -135,6 +166,10 @@ const loginUser = async (req, res, next) => {
console.log('Результат проверки пароля:', isMatch ? 'Успешно' : 'Неверный пароль'); console.log('Результат проверки пароля:', isMatch ? 'Успешно' : 'Неверный пароль');
if (isMatch) { if (isMatch) {
// Обновляем дату последнего входа
user.lastSeen = new Date();
await user.save();
res.status(200).json({ res.status(200).json({
_id: user._id, _id: user._id,
name: user.name, name: user.name,
@ -150,6 +185,30 @@ const loginUser = async (req, res, next) => {
return; return;
} }
// Перед проверкой обычных пользователей, проверим наличие админа с почтой
if (email === 'admin@example.com') {
console.log('Попытка входа с email администратора: admin@example.com');
// Проверяем наличие админа с логином admin
const adminUser = await User.findOne({ email: 'admin' }).select('+password');
if (adminUser && await adminUser.matchPassword(password)) {
console.log('Успешный вход через email администратора, перенаправление на логин admin');
// Обновляем дату последнего входа
adminUser.lastSeen = new Date();
await adminUser.save();
res.status(200).json({
_id: adminUser._id,
name: adminUser.name,
email: adminUser.email,
isAdmin: true,
token: generateToken(adminUser._id),
message: 'Вход выполнен успешно!'
});
return;
}
}
// Для обычных пользователей продолжаем проверку email // Для обычных пользователей продолжаем проверку email
const normalizedEmail = email.toLowerCase(); const normalizedEmail = email.toLowerCase();
console.log('Нормализованный email для поиска:', normalizedEmail); console.log('Нормализованный email для поиска:', normalizedEmail);

View File

@ -41,13 +41,18 @@ const io = new Server(server, { // <--- Инициализация socket.io
app.set('io', io); app.set('io', io);
// Подключение к базе данных - проверяем, что импортировали функцию // Подключение к базе данных - проверяем, что импортировали функцию
if (typeof connectDBModule === 'function') { if (typeof connectDBModule === 'function') { try {
try {
connectDBModule() // Вызов функции подключения connectDBModule() // Вызов функции подключения
.then(() => { .then(async () => {
console.log('Успешное подключение к базе данных'); console.log('Успешное подключение к базе данных');
console.log('Инициализация административного аккаунта...');
// Инициализируем админ-аккаунт после подключения к БД // Инициализируем админ-аккаунт после подключения к БД
initAdminAccount(); try {
await initAdminAccount();
console.log('Инициализация администратора завершена');
} catch (adminError) {
console.error('Ошибка при инициализации административного аккаунта:', adminError);
}
}) })
.catch(err => { .catch(err => {
console.error('Ошибка при подключении к базе данных:', err); console.error('Ошибка при подключении к базе данных:', err);

View File

@ -0,0 +1,54 @@
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const User = require('../models/User');
// Load env vars
dotenv.config();
// Connect to DB
mongoose.connect(process.env.MONGO_URI)
.then(() => console.log('MongoDB Connected'))
.catch(err => {
console.error('Error connecting to MongoDB:', err.message);
process.exit(1);
});
const createAdminAccount = async () => {
try {
// Check if admin already exists
const adminExists = await User.findOne({ email: 'admin' });
if (adminExists) {
console.log('Admin account already exists');
console.log('Email: admin');
console.log('Password: admin124');
process.exit(0);
}
// Create admin user
const admin = new User({
name: 'Администратор',
email: 'admin',
password: 'admin124',
dateOfBirth: new Date('1990-01-01'),
gender: 'other',
isActive: true,
isAdmin: true,
location: {
city: 'Admin',
country: 'System'
}
});
await admin.save();
console.log('Admin account created successfully');
console.log('Email: admin');
console.log('Password: admin124');
process.exit(0);
} catch (error) {
console.error('Error creating admin account:', error);
process.exit(1);
}
};
createAdminAccount();

View File

@ -1,4 +1,5 @@
const User = require('../models/User'); const User = require('../models/User');
const bcrypt = require('bcryptjs');
/** /**
* Инициализирует административный аккаунт в системе * Инициализирует административный аккаунт в системе
@ -7,14 +8,18 @@ const User = require('../models/User');
*/ */
const initAdminAccount = async () => { const initAdminAccount = async () => {
try { try {
console.log('[ADMIN INIT] Проверка наличия административного аккаунта...');
// Проверяем, существует ли уже админ // Проверяем, существует ли уже админ
const adminExists = await User.findOne({ email: 'admin', isAdmin: true }); const adminExists = await User.findOne({ email: 'admin', isAdmin: true });
if (!adminExists) { if (!adminExists) {
console.log('[ADMIN INIT] Административный аккаунт не найден. Создаю новый...');
// Создаем админа, если не существует // Создаем админа, если не существует
const admin = new User({ const admin = new User({
name: 'Администратор', name: 'Администратор',
email: 'admin', // Изменено с 'admin@example.com' на 'admin' email: 'admin', // Используем 'admin' как логин
password: 'admin124', password: 'admin124',
dateOfBirth: new Date('1990-01-01'), // Устанавливаем формальную дату рождения dateOfBirth: new Date('1990-01-01'), // Устанавливаем формальную дату рождения
gender: 'other', gender: 'other',
@ -24,15 +29,22 @@ const initAdminAccount = async () => {
city: 'Admin', city: 'Admin',
country: 'System' country: 'System'
} }
}); }); // Сохраняем админа
const savedAdmin = await admin.save();
await admin.save(); if (savedAdmin) {
console.log('Административный аккаунт успешно создан с email: admin'); console.log('[ADMIN INIT] Административный аккаунт успешно создан с логином: admin');
console.log('[ADMIN INIT] ID администратора:', savedAdmin._id);
console.log('[ADMIN INIT] Для входа используйте: логин "admin", пароль "admin124"');
} else { } else {
console.log('Административный аккаунт с email: admin уже существует'); console.error('[ADMIN INIT] Ошибка при сохранении администратора - не возвращен объект');
}
} else {
console.log('[ADMIN INIT] Административный аккаунт с логином "admin" уже существует');
console.log('[ADMIN INIT] ID администратора:', adminExists._id);
} }
} catch (error) { } catch (error) {
console.error('Ошибка при инициализации админ-аккаунта:', error); console.error('[ADMIN INIT] Ошибка при инициализации админ-аккаунта:', error.message);
console.error('[ADMIN INIT] Полная ошибка:', error);
} }
}; };

167
backend/utils/test-admin.js Normal file
View File

@ -0,0 +1,167 @@
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const User = require('../models/User');
const dotenv = require('dotenv');
// Load environment variables
dotenv.config();
// Connect to MongoDB
const connectDB = async () => {
try {
console.log('MongoDB URI:', process.env.MONGO_URI);
await mongoose.connect(process.env.MONGO_URI);
console.log('MongoDB Connected');
return true;
} catch (error) {
console.error('MongoDB Connection Error:', error);
return false;
}
};
// Function to create admin
const createAdmin = async () => {
try {
// Check if admin exists
let admin = await User.findOne({ email: 'admin' });
if (admin) {
console.log('Admin user already exists:');
console.log({
id: admin._id,
name: admin.name,
email: admin.email,
isAdmin: admin.isAdmin
});
// Update admin to ensure correct properties
admin.name = 'Администратор';
admin.isAdmin = true;
admin.isActive = true;
await admin.save();
console.log('Admin user updated');
return admin;
}
// Create new admin user if doesn't exist
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash('admin124', salt);
admin = new User({
name: 'Администратор',
email: 'admin',
password: hashedPassword,
dateOfBirth: new Date('1990-01-01'),
gender: 'other',
isActive: true,
isAdmin: true,
location: {
city: 'Admin',
country: 'System'
}
});
await admin.save();
console.log('Admin user created successfully:');
console.log({
id: admin._id,
name: admin.name,
email: admin.email,
isAdmin: admin.isAdmin
});
return admin;
} catch (error) {
console.error('Error creating admin:', error);
return null;
}
};
// Create admin alias with email = admin@example.com
const createAdminAlias = async () => {
try {
// Check if admin@example.com exists
let adminAlias = await User.findOne({ email: 'admin@example.com' });
if (adminAlias) {
console.log('Admin alias already exists');
return adminAlias;
}
// Find the main admin user
const mainAdmin = await User.findOne({ email: 'admin' });
if (!mainAdmin) {
console.error('Cannot create admin alias: main admin account not found');
return null;
}
// Create admin alias
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash('admin124', salt);
adminAlias = new User({
name: 'Администратор',
email: 'admin@example.com',
password: hashedPassword,
dateOfBirth: new Date('1990-01-01'),
gender: 'other',
isActive: true,
isAdmin: true,
location: {
city: 'Admin',
country: 'System'
}
});
await adminAlias.save();
console.log('Admin alias created successfully:');
console.log({
id: adminAlias._id,
name: adminAlias.name,
email: adminAlias.email,
isAdmin: adminAlias.isAdmin
});
return adminAlias;
} catch (error) {
console.error('Error creating admin alias:', error);
return null;
}
};
// Main function
const main = async () => {
console.log('Testing Admin Creation...');
// Connect to database
const connected = await connectDB();
if (!connected) {
console.error('Failed to connect to database');
process.exit(1);
}
// Create admin user
const admin = await createAdmin();
if (!admin) {
console.error('Failed to create admin user');
process.exit(1);
}
// Create admin alias
const adminAlias = await createAdminAlias();
console.log('\nAdmin Credentials:');
console.log('1. Login: admin');
console.log(' Password: admin124');
if (adminAlias) {
console.log('2. Login: admin@example.com');
console.log(' Password: admin124');
}
console.log('\nDone!');
process.exit(0);
};
main();