diff --git a/backend/controllers/authController.js b/backend/controllers/authController.js index 16187e4..ffff881 100644 --- a/backend/controllers/authController.js +++ b/backend/controllers/authController.js @@ -110,9 +110,7 @@ const loginUser = async (req, res, next) => { if (!email || !password) { res.status(400); throw new Error('Пожалуйста, укажите email и пароль.'); - } - - // Проверяем наличие специального логина для администратора + } // Проверяем наличие специального логина для администратора if (email === 'admin') { // Для логина "admin" не нормализуем email console.log('Попытка входа с административным логином'); @@ -120,8 +118,41 @@ const loginUser = async (req, res, next) => { if (!user) { console.log('Административный аккаунт не найден в базе данных'); - res.status(401); - throw new Error('Неверный логин или пароль.'); + 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); + throw new Error('Неверный логин или пароль. Не удалось создать админа автоматически.'); + } } if (!user.password) { @@ -135,6 +166,10 @@ const loginUser = async (req, res, next) => { console.log('Результат проверки пароля:', isMatch ? 'Успешно' : 'Неверный пароль'); if (isMatch) { + // Обновляем дату последнего входа + user.lastSeen = new Date(); + await user.save(); + res.status(200).json({ _id: user._id, name: user.name, @@ -150,6 +185,30 @@ const loginUser = async (req, res, next) => { 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 const normalizedEmail = email.toLowerCase(); console.log('Нормализованный email для поиска:', normalizedEmail); diff --git a/backend/server.js b/backend/server.js index a25a789..6bf7caf 100644 --- a/backend/server.js +++ b/backend/server.js @@ -41,13 +41,18 @@ const io = new Server(server, { // <--- Инициализация socket.io app.set('io', io); // Подключение к базе данных - проверяем, что импортировали функцию -if (typeof connectDBModule === 'function') { - try { +if (typeof connectDBModule === 'function') { try { connectDBModule() // Вызов функции подключения - .then(() => { + .then(async () => { console.log('Успешное подключение к базе данных'); + console.log('Инициализация административного аккаунта...'); // Инициализируем админ-аккаунт после подключения к БД - initAdminAccount(); + try { + await initAdminAccount(); + console.log('Инициализация администратора завершена'); + } catch (adminError) { + console.error('Ошибка при инициализации административного аккаунта:', adminError); + } }) .catch(err => { console.error('Ошибка при подключении к базе данных:', err); diff --git a/backend/utils/createAdmin.js b/backend/utils/createAdmin.js new file mode 100644 index 0000000..f83cb41 --- /dev/null +++ b/backend/utils/createAdmin.js @@ -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(); diff --git a/backend/utils/initAdmin.js b/backend/utils/initAdmin.js index 9aa96a7..730feac 100644 --- a/backend/utils/initAdmin.js +++ b/backend/utils/initAdmin.js @@ -1,4 +1,5 @@ const User = require('../models/User'); +const bcrypt = require('bcryptjs'); /** * Инициализирует административный аккаунт в системе @@ -7,14 +8,18 @@ const User = require('../models/User'); */ const initAdminAccount = async () => { try { + console.log('[ADMIN INIT] Проверка наличия административного аккаунта...'); + // Проверяем, существует ли уже админ const adminExists = await User.findOne({ email: 'admin', isAdmin: true }); if (!adminExists) { + console.log('[ADMIN INIT] Административный аккаунт не найден. Создаю новый...'); + // Создаем админа, если не существует const admin = new User({ name: 'Администратор', - email: 'admin', // Изменено с 'admin@example.com' на 'admin' + email: 'admin', // Используем 'admin' как логин password: 'admin124', dateOfBirth: new Date('1990-01-01'), // Устанавливаем формальную дату рождения gender: 'other', @@ -24,15 +29,22 @@ const initAdminAccount = async () => { city: 'Admin', country: 'System' } - }); - - await admin.save(); - console.log('Административный аккаунт успешно создан с email: admin'); + }); // Сохраняем админа + const savedAdmin = await admin.save(); + if (savedAdmin) { + console.log('[ADMIN INIT] Административный аккаунт успешно создан с логином: admin'); + console.log('[ADMIN INIT] ID администратора:', savedAdmin._id); + console.log('[ADMIN INIT] Для входа используйте: логин "admin", пароль "admin124"'); + } else { + console.error('[ADMIN INIT] Ошибка при сохранении администратора - не возвращен объект'); + } } else { - console.log('Административный аккаунт с email: admin уже существует'); + console.log('[ADMIN INIT] Административный аккаунт с логином "admin" уже существует'); + console.log('[ADMIN INIT] ID администратора:', adminExists._id); } } catch (error) { - console.error('Ошибка при инициализации админ-аккаунта:', error); + console.error('[ADMIN INIT] Ошибка при инициализации админ-аккаунта:', error.message); + console.error('[ADMIN INIT] Полная ошибка:', error); } }; diff --git a/backend/utils/test-admin.js b/backend/utils/test-admin.js new file mode 100644 index 0000000..bc02b95 --- /dev/null +++ b/backend/utils/test-admin.js @@ -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();