NodeJS - Экспресс - Сеансы - Перенаправление на защищенную страницу - PullRequest
0 голосов
/ 03 мая 2019

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

Пример:

var auth = function(req,res,next){
    if (req.session.loggedin){
        return next();
    } else{
        return res.sendStatus(401);
    }
};

app.get('/list-video', auth, function (req, res) {
    res.redirect('/list-video');
});

Поэтому моя проблема в том, что «/ list-video» - это страница, которую я хочу защитить, и доступ к которой возможен только после успешного входа пользователя. Но после проверки яперенаправляю на ту же страницу: '/ list-video'.это не похоже на работу, так как я, очевидно, зацикливаюсь.Я попытался перенаправить на другую страницу, например «/ list-audio», и, конечно, это работает нормально.

Может кто-нибудь посоветовать, как это обычно делается?Нужно ли создавать отдельную ссылку, на которую я могу перенаправить?(Я хочу запретить пользователям переходить по этой ссылке вручную, введя URL-адрес в браузере.)

Буду признателен за любую помощь или совет!

Мой полный код app.js:

const express = require('express');
const fileUpload = require('express-fileupload');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const path = require('path');
const app = express();
const session = require('express-session');

const { getHomePage } = require('./routes/index');

const { getBackendPage } = require('./routes/backend');
const { getVideoPage, listVideoPage, editVideoPage, editVideo, deleteVideo, addVideoPage, addVideo } = require('./routes/video');
const { getEbookPage } = require('./routes/ebook');
const { getMusicPage } = require('./routes/music');
const { getGamePage } = require('./routes/game');
const { getShopPage } = require('./routes/shop');

const port = 5000;


const db = mysql.createConnection({
    host: '127.0.0.1',
    user: 'user',
    password: 'bla',
    database: 'test'
    
    db.connect((err) => {
    if (err) {
        throw err;
    }
    console.log('Connected to database');
});
global.db = db;

// configure middleware
app.set('port', process.env.port || port); // set express to use this port
app.set('views', __dirname + '/views'); // set express to look in this folder to render our view
app.set('view engine', 'ejs'); // configure template engine
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json()); // parse form data client
app.use(express.static(path.join(__dirname, 'public'))); // configure express to use public folder
app.use(fileUpload()); // configure fileupload
app.use(session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true
}));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
    
    
/ passenger views
app.get('/', getHomePage);
app.get('/backend', getBackendPage);
app.get('/video', getVideoPage);
app.get('/ebook', getEbookPage);
app.get('/music/:id', getMusicPage);
app.get('/game', getGamePage);
app.get('/shop', getShopPage);

// backend views video
app.get('/edit-video/:id', editVideoPage);
app.post('/edit-video/:id', editVideo);
app.get('/add-video', addVideoPage);
app.post('/add-video', addVideo);
app.get('/delete-video/:id', deleteVideo);


// login screen
app.post('/auth', function (request, response) {
    var username = request.body.username;
    var password = request.body.password;
    if (username && password) {
        db.query('SELECT * FROM accounts WHERE username = ? AND password = ?', [username, password], function (error, results, fields) {
            if (results.length > 0) {
                request.session.loggedin = true;
                request.session.username = username;
                response.redirect('/');
            } else {
                response.send('Incorrect Username and/or Password!');
            }
            response.end();
        });
    } else {
        response.send('Please enter Username and Password!');
        response.end();
    }
});

var auth = function(req,res,next){
    if (req.session.loggedin){
        return next();
    } else{
        return res.sendStatus(401);
    }
};

app.get('/list-video', auth, function (req, res) {
    res.redirect('/list-video');
});

  app.listen(port, () => {
    console.log(`Server running on port: http://localhost:${port}`);
});  

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

измените его на:

var auth = function(req,res,next){
    if (!req.session.loggedin){
        return res.redirect("/login");
    } else{
        return next();
    }
};

app.get('/list-video', auth);

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

0 голосов
/ 03 мая 2019

Переместите защищенные страницы в другой каталог (вне папки, в которой находятся ваши общедоступные статические файлы) и подайте express.static после промежуточного программного обеспечения для аутентификации, что-то вроде этого:

app.use('/', express.static(path.join(__dirname, 'public'))); //notice I have no auth middleware
app.use('/mysecretpages', auth, express.static(path.join(__dirname, 'secret'))); //notice I DO have auth middleware
...