diff --git a/auth-service/src/middleware/auth.js b/auth-service/src/middleware/auth.js new file mode 100644 index 0000000..f5a36ba --- /dev/null +++ b/auth-service/src/middleware/auth.js @@ -0,0 +1,39 @@ +import jwt from 'jsonwebtoken'; +import { User } from '../models/index.js'; + +function getJwtSecret(payload) { + const base = process.env.JWT_SECRET || 'secret'; + if (payload && payload.rememberMe) { + return base; + } + const hour = new Date().toISOString().slice(0, 13); // YYYY-MM-DDTHH + return base + ':' + hour; +} + +export default async function authMiddleware(req, res, next) { + const authHeader = req.headers['authorization']; + if (!authHeader || !authHeader.startsWith('Bearer ')) { + return res.status(401).json({ error: 'No token provided' }); + } + + const token = authHeader.split(' ')[1]; + try { + // Сначала декодируем без проверки, чтобы узнать rememberMe + let payload = null; + try { + payload = jwt.decode(token); + } catch {} + + const secret = getJwtSecret(payload); + payload = jwt.verify(token, secret); + + // Найти пользователя по id + const user = await User.findByPk(payload.id); + if (!user) return res.status(401).json({ error: 'User not found' }); + + req.user = { id: user.id, email: user.email, role_id: user.role_id }; + next(); + } catch (err) { + return res.status(401).json({ error: 'Invalid token', details: err.message }); + } +} \ No newline at end of file diff --git a/auth-service/src/routes/role.js b/auth-service/src/routes/role.js index 680998e..081bd87 100644 --- a/auth-service/src/routes/role.js +++ b/auth-service/src/routes/role.js @@ -1,12 +1,13 @@ import { Router } from 'express'; import roleController from '../controllers/roleController.js'; +import authMiddleware from '../middleware/auth.js'; const router = Router(); -router.post('/', roleController.create); -router.get('/', roleController.getAll); -router.get('/:id', roleController.getById); -router.put('/:id', roleController.update); -router.delete('/:id', roleController.delete); +router.post('/', authMiddleware, roleController.create); +router.get('/', authMiddleware, roleController.getAll); +router.get('/:id', authMiddleware, roleController.getById); +router.put('/:id', authMiddleware, roleController.update); +router.delete('/:id', authMiddleware, roleController.delete); export default router; \ No newline at end of file diff --git a/auth-service/src/routes/user.js b/auth-service/src/routes/user.js index 7ab8fd0..97824ff 100644 --- a/auth-service/src/routes/user.js +++ b/auth-service/src/routes/user.js @@ -1,13 +1,14 @@ import { Router } from 'express'; import userController from '../controllers/userController.js'; +import authMiddleware from '../middleware/auth.js'; const router = Router(); -router.post('/', userController.create); -router.get('/', userController.getAll); -router.get('/:id', userController.getById); -router.put('/:id', userController.update); -router.delete('/:id', userController.delete); +router.post('/', authMiddleware, userController.create); +router.get('/', authMiddleware, userController.getAll); +router.get('/:id', authMiddleware, userController.getById); +router.put('/:id', authMiddleware, userController.update); +router.delete('/:id', authMiddleware, userController.delete); router.post('/login', userController.login); export default router; \ No newline at end of file diff --git a/frontend/src/components/SideMenu.js b/frontend/src/components/SideMenu.js index 95fb4be..74f10ed 100644 --- a/frontend/src/components/SideMenu.js +++ b/frontend/src/components/SideMenu.js @@ -18,7 +18,6 @@ const SideMenu = ({ active, onSelect }) => {
Администрирование
diff --git a/frontend/src/modals/CreateUserModal.js b/frontend/src/modals/CreateUserModal.js index c5ae34d..e769872 100644 --- a/frontend/src/modals/CreateUserModal.js +++ b/frontend/src/modals/CreateUserModal.js @@ -15,10 +15,19 @@ export default function CreateUserModal({ isOpen, onClose, user, roles, loading,
diff --git a/frontend/src/pages/Dashboard.js b/frontend/src/pages/Dashboard.js index 7473564..5009d90 100644 --- a/frontend/src/pages/Dashboard.js +++ b/frontend/src/pages/Dashboard.js @@ -3,7 +3,6 @@ import SideMenu from '../components/SideMenu'; import Header from '../components/Header'; import { useUser } from '../context/UserContext'; import UsersPage from './UsersPage'; -import RolesPage from './RolesPage'; import SmtpServersPage from './SmtpServersPage'; import EmailTemplatesPage from './EmailTemplatesPage'; import UnsubscribedPage from './UnsubscribedPage'; @@ -23,7 +22,6 @@ const Dashboard = () => { function renderPage() { switch (active) { case 'users': return ; - case 'roles': return ; case 'smtp': return ; case 'template': return ; case 'unsubscribed': return ; diff --git a/frontend/src/pages/UsersPage.js b/frontend/src/pages/UsersPage.js index d1eadae..77e98ec 100644 --- a/frontend/src/pages/UsersPage.js +++ b/frontend/src/pages/UsersPage.js @@ -62,12 +62,18 @@ function UsersPage() { headers: token ? { Authorization: `Bearer ${token}` } : {} }); const data = await res.json(); - if (res.ok && Array.isArray(data)) { - setRoles(data); + console.log('Roles API response:', data); // Отладочная информация + if (res.ok) { + // API всегда возвращает объект с rows и count + const rolesData = data.rows || []; + console.log('Setting roles:', rolesData); // Отладочная информация + setRoles(rolesData); } else { + console.error('Roles API error:', data); // Отладочная информация setRoles([]); } - } catch { + } catch (error) { + console.error('Roles fetch error:', error); // Отладочная информация setRoles([]); } }; @@ -128,6 +134,11 @@ function UsersPage() { }; const handleCreate = () => { + // Убеждаемся, что у нас есть роли перед созданием пользователя + if (roles.length === 0) { + alert('Загрузка ролей... Пожалуйста, подождите.'); + return; + } setCreateUser({ email: '', name: '', role_id: roles[0]?.id || 1, password: '' }); }; @@ -232,6 +243,16 @@ function UsersPage() { onSave={handleCreateSave} /> )} + {/* Отладочная информация */} + {process.env.NODE_ENV === 'development' && ( +
+ Debug Info:
+ Roles count: {roles.length}
+ Roles: {JSON.stringify(roles.slice(0, 3))}
+ Edit user: {editUser ? JSON.stringify(editUser) : 'null'}
+ Create user: {createUser ? JSON.stringify(createUser) : 'null'} +
+ )}
); }