Ошибка доступа на основе ролей JavaScriptJavascript

Форум по Javascript
Ответить
Гость
 Ошибка доступа на основе ролей JavaScript

Сообщение Гость »


Я очень новичок в разработке серверной части и решил использовать Node.JS в качестве серверной части, поскольку у меня уже есть опыт работы с интерфейсом JS, и я не понимаю, как я могу реализовать доступ на основе ролей.

Я хочу, чтобы код блокировал доступ всех пользователей, не вошедших в систему, к чему-либо, кроме страницы входа и регистрации, а также не позволял пользователю без соответствующей роли получать доступ к определенным вещам.

вот мой вход в систему JS:

// Дождитесь загрузки DOM if (document.readyState == 'загрузка') { document.addEventListener('DOMContentLoaded', готово); } еще { готовый(); } функция готова() { const loginpassword = document.getElementById('loginpassword'); const togglePasswordButton = document.getElementById('ShowPass'); togglePasswordButton.addEventListener('click', function () { if (loginpassword.type === 'пароль') { логинпароль.тип = 'текст'; } еще { loginpassword.type = 'пароль'; togglePasswordButton.textContent = 'Показать пароль'; } }); // Добавляем прослушиватель событий к кнопке входа в систему const loginButton = document.getElementById('Логин'); loginButton.addEventListener('click', () => { const имя пользователя = document.getElementById('loginuser').value; const пароль = document.getElementById('loginpassword').value; // Проверяем ввод пользователя if (!имя пользователя || !пароль) { alert('Пожалуйста, введите имя пользователя и пароль.'); возвращаться; } // Создаем объект с данными для входа константные данные входа = { имя пользователя, пароль, }; // Отправляем POST-запрос на внутренний маршрут входа в систему выборка('/api/логин', { метод: 'POST', заголовки: { «Тип контента»: «приложение/json», }, тело: JSON.stringify(loginData), }) .then((ответ) => ответ.json()) .then((данные) => { если (data.error) { // Отображение предупреждения об ошибке, если вход невозможен alert('Не удалось войти. Пожалуйста, проверьте свое имя пользователя и пароль.'); } еще { // Надежно сохраняем токен в localStorage localStorage.setItem('authToken', data.token); // Определить, куда перенаправить на основе доступа пользователя if (data.access === 'учитель') { window.location.href = '../Teacher-Pages/T-Home.html'; // URL-адрес панели управления учителя } else if (data.access === 'студент') { window.location.href = '../Student-Pages/S-Home.html'; // URL-адрес панели управления учеником } еще { alert('Неверный доступ пользователя.'); // Обработка других типов доступа по мере необходимости } } }) .catch((ошибка) => { console.error(ошибка); // Регистрируем ошибку для отладки alert('Во время входа в систему произошла ошибка.'); }); }); } Здесь токен, который я устанавливаю при входе пользователя в систему

// Используемые пакеты NPM const express = require('express'); // Node Framework для веб-приложений const router = express.Router(); // Экспресс для экспорта этого маршрута в виде файлов, извлекаемых маршрутизатором с помощью внешнего интерфейса const mysql = require('mysql'); // Пакет NPM для использования MySQL const bodyParser = require('body-parser'); // Пакет NPM, который позволяет серверной части анализировать вводимые пользователем данные в формате json const bcrypt = require('bcrypt'); // Пакет NPM, используемый для шифрования паролей const jwt = require('jsonwebtoken'); // Пакет NPM для создания токенов сеанса const Connection = require('../database/connector'); const config = require('../Misc/Config'); router.use(bodyParser.json()); // Определить маршрут входа router.post('/login', (req, res) => { const {имя пользователя, пароль} = req.body; // Проверяем, указаны ли имя пользователя и пароль if (!имя пользователя || !пароль) { res.status(400).json({ error: 'Требуются имя пользователя и пароль.' }); возвращаться; } // Запрос к базе данных, чтобы найти пользователя по имени пользователя const sql = 'ВЫБРАТЬ * ИЗ аккаунтов.loginfo ГДЕ имя пользователя =?'; Connection.query(sql, [имя пользователя], async (ошибка, результаты) => { если (ошибка) { console.error(ошибка); res.status(500).json({ error: 'Произошла ошибка при входе в систему.' }); } еще { // Проверяем, существует ли пользователь если (results.length === 0) { res.status(401).json({ error: 'Неверное имя пользователя или пароль.' }); } еще { // Проверка пароля константный пользователь = результаты [0]; constpasswordMatch = ждут bcrypt.compare(пароль, user.password); если (!passwordMatch) { res.status(401).json({ error: 'Неверное имя пользователя или пароль.' }); } еще { // Пользователь аутентифицирован; создать токен JWT с ролью пользователя константный токен = генерироватьAuthToken (пользователь); // Включаем роль пользователя в ответ res.status(200).json({token, access: user.access }); } } } }); }); // Функция для генерации токена JWT с ролью пользователя функция генерироватьAuthToken (пользователь) { // Включаем данные и роль пользователя в полезную нагрузку токена JWT const token = jwt.sign({userId: user.id, имя пользователя: user.username, роль: user.access }, config.secretKey, { expiresIn: '2h' }); вернуть токен; } модуль.экспорт = маршрутизатор; (не обращайте внимания на некоторые комментарии, это для документации) Здесь, на внутреннем маршруте, я добавляю в токен некоторую информацию о том, кто вошел в систему

// аутентификация.js const jwt = require('jsonwebtoken'); const config = require('../Misc/Config'); функция аутентификацииToken(requiredRole) { return (req, res, next) => { константный токен = req.headers.authorization; если (!токен) { return res.status(401).json({ ошибка: «Токен аутентификации отсутствует.» }); } jwt.verify(токен, config.secretKey, (ошибка, пользователь) => { если (ошибка) { return res.status(403).json({ error: 'Неверный токен.' }); } if (user.access !== требуемая роль) { return res.status(403).json({ error: 'Доступ запрещен. Недостаточно привилегий.' }); } req.user = пользователь; следующий(); }); }; } модуль.экспорт = аутентификацияТокен; Здесь я попытался добавить функцию аутентификации с помощью токенов. (но в моем случае они не работают, потому что, несмотря на то, что я не вошел в систему и просто подделываю URL-адрес, я могу получить доступ к страницам, доступ к которым должен иметь только тот, кто вошёл в систему)

// Student-homepage.js // Подождем, пока загрузится DOM if (document.readyState === 'загрузка') { document.addEventListener('DOMContentLoaded', setup); } еще { настраивать(); } настройка функции() { const logoutButton = document.getElementById('Выход'); logoutButton.addEventListener('click', () => { const authToken = localStorage.getItem('authToken'); если (!authToken) { window.location.href = '../Universal-Pages/LogIn.html'; } еще { выборка('/api/выход', { метод: 'POST', заголовки: { «Тип контента»: «приложение/json», }, }) .then((ответ) => { если (ответ.ок) { localStorage.removeItem('authToken'); window.location.href = '../Universal-Pages/LogIn.html'; alert('Выход выполнен успешно'); } еще { alert('Не удалось выйти из системы. Повторите попытку.'); } }) .catch((ошибка) => { console.error(ошибка); alert('Во время выхода из системы произошла ошибка.'); }); } // Декодируем токен, чтобы получить роль пользователя const decodedToken = jwt_decode(authToken); const userRole = decodedToken.access; if (userRole !== 'студент') { window.location.href = '../Universal-Pages/AccessDenied.html'; } }); } Вот, например, для сценария внешнего интерфейса домашней страницы студента, у меня есть код, который должен проверять, является ли пользователь студентом на основе его токена, но в моем случае они не работают, этот код также должен работать в сочетании с следующее:

const express = require('express'); const router = express.Router(); const authenticateToken = require('./authentication'); // Защищенный маршрут домашней страницы учителя router.get('/student-home', authentateToken('студент'), (req, res) => { res.sendFile('../public/Student-Pages/S-Home.html'); }); модуль.экспорт = маршрутизатор; У меня есть подозрение, что я, возможно, сделал что-то не так, поэтому прошу вашей помощи в разрешении моего затруднительного положения.

Вот мой основной файл app.js, если это необходимо:

// Используемые пакеты NPM const express = require('express'); константное приложение = экспресс(); const bodyParser = require('body-parser'); const jwt = require('jsonwebtoken'); const config = require('./Misc/Config'); // Импортируем необходимые маршруты const SignupRoute = require('./routes/signup'); const loginRoute = require('./routes/login'); const logoutRoute = require('./routes/logout'); const authFunction = require('./routes/authentication'); const StudentRoute = require('./routes/student'); const TeacherRoute = require('./routes/teacher'); // Обслуживаем статические файлы из общедоступного каталога app.use(express.static('public')); // Промежуточное программное обеспечение для анализа входящих данных JSON app.use(bodyParser.json()); // префиксы API app.use('/api', SignupRoute); app.use('/api', loginRoute); app.use('/api', logoutRoute); app.use('/api', StudentRoute); app.use('/api', TeacherRoute); app.use('/func', authFunction); // Запускаем сервер константный порт = процесс.env.PORT || 3002; app.listen(port, () => { console.log(`Сервер работает на порту ${port}`); }); Вот также моя файловая структура:

Структура файла

Опять же, я новичок в полнофункциональной веб-разработке, и мне нужно, как я могу реализовать систему доступа на основе ролей и запретить людям, которые не вошли в систему, доступ к страницам путем подделки URL-адреса. Я знаю, Вопрос довольно громоздкий, но я благодарю всех, кто может помочь. При необходимости я могу предоставить дополнительную информацию или код.

и если вы знаете лучший способ реализовать нужную мне функцию вместо моего неуклюжего кода, дайте мне знать.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»