Как создать систему доступа на основе ролей в веб-приложении с использованием токенов в Node.JS? ⇐ Javascript
-
Гость
Как создать систему доступа на основе ролей в веб-приложении с использованием токенов в Node.JS?
Итак, по сути, я хочу добиться здесь того, чтобы позволить вошедшим в систему пользователям получать доступ к страницам, которые им позволяет их роль/уровень доступа, в то же время запрещая тем, у кого меньшие или другие роли, получать доступ к страницам с более высоким доступом (например, очевидно, я не Я не хочу, чтобы учащиеся возились с базой данных библиотеки, и поэтому эта привилегия/доступ к веб-странице с этой функцией зарезервирована для учителей и выше) Кроме того, я также не хочу, чтобы пользователи, которые не вошли в систему, имели доступ к чему-либо, кроме страница регистрации и входа.
На данный момент у меня есть некоторая базовая инфраструктура на бэкэнде, которая записывает уровень доступа пользователей в их токен при входе в систему:
const express = require('express'); const router = express.Router(); const mysql = require('mysql'); const bodyParser = require('body-parser'); const bcrypt = require('bcrypt'); const jwt = require('jsonwebtoken'); // Импортируем jsonwebtoken для генерации токена 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 }, config.secretKey, { expiresIn: '1h' }); вернуть токен; } модуль.экспорт = маршрутизатор; Вот соответствующий журнал во внешнем интерфейсе:
// Дождитесь загрузки 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('Во время входа в систему произошла ошибка.'); }); }); } Оба этих JS работают, и я протестировал и зарегистрировал, создает ли токен, когда пользователь входит в систему, и это работает. но я не знаю, как работать с системой ролевого доступа, я новичок в веб-разработке с полным стеком, поэтому буду благодарен за любую помощь.
Вот мой app.js:
const express = require('express'); константное приложение = экспресс(); const bodyParser = require('body-parser'); // Импортируем маршруты регистрации и входа в систему const SignupRoute = require('./routes/signup'); const loginRoute = require('./routes/login'); // Импортируем ваш маршрут входа const logoutRoute = require('./routes/logout') // Обслуживаем статические файлы из общедоступного каталога app.use(express.static('public')); // Промежуточное программное обеспечение для анализа входящих данных JSON app.use(bodyParser.json()); // Используйте маршруты регистрации и входа с соответствующими префиксами app.use('/api', SignupRoute); app.use('/api', loginRoute); // Добавляем маршрут входа app.use('/api', logoutRoute); // Запускаем сервер константный порт = процесс.env.PORT || 3002; app.listen(port, () => { console.log(`Сервер работает на порту ${port}`); });
Итак, по сути, я хочу добиться здесь того, чтобы позволить вошедшим в систему пользователям получать доступ к страницам, которые им позволяет их роль/уровень доступа, в то же время запрещая тем, у кого меньшие или другие роли, получать доступ к страницам с более высоким доступом (например, очевидно, я не Я не хочу, чтобы учащиеся возились с базой данных библиотеки, и поэтому эта привилегия/доступ к веб-странице с этой функцией зарезервирована для учителей и выше) Кроме того, я также не хочу, чтобы пользователи, которые не вошли в систему, имели доступ к чему-либо, кроме страница регистрации и входа.
На данный момент у меня есть некоторая базовая инфраструктура на бэкэнде, которая записывает уровень доступа пользователей в их токен при входе в систему:
const express = require('express'); const router = express.Router(); const mysql = require('mysql'); const bodyParser = require('body-parser'); const bcrypt = require('bcrypt'); const jwt = require('jsonwebtoken'); // Импортируем jsonwebtoken для генерации токена 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 }, config.secretKey, { expiresIn: '1h' }); вернуть токен; } модуль.экспорт = маршрутизатор; Вот соответствующий журнал во внешнем интерфейсе:
// Дождитесь загрузки 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('Во время входа в систему произошла ошибка.'); }); }); } Оба этих JS работают, и я протестировал и зарегистрировал, создает ли токен, когда пользователь входит в систему, и это работает. но я не знаю, как работать с системой ролевого доступа, я новичок в веб-разработке с полным стеком, поэтому буду благодарен за любую помощь.
Вот мой app.js:
const express = require('express'); константное приложение = экспресс(); const bodyParser = require('body-parser'); // Импортируем маршруты регистрации и входа в систему const SignupRoute = require('./routes/signup'); const loginRoute = require('./routes/login'); // Импортируем ваш маршрут входа const logoutRoute = require('./routes/logout') // Обслуживаем статические файлы из общедоступного каталога app.use(express.static('public')); // Промежуточное программное обеспечение для анализа входящих данных JSON app.use(bodyParser.json()); // Используйте маршруты регистрации и входа с соответствующими префиксами app.use('/api', SignupRoute); app.use('/api', loginRoute); // Добавляем маршрут входа app.use('/api', logoutRoute); // Запускаем сервер константный порт = процесс.env.PORT || 3002; app.listen(port, () => { console.log(`Сервер работает на порту ${port}`); });
Мобильная версия