Применение авторизации на маршрутах в Express. js - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь разработать веб-приложение, которое состоит из информационной панели для клиентов и информационной панели для администраторов. В админ-панели есть маршруты для изменения и удаления пользователя. И я должен держать административные маршруты в безопасности. Поэтому, если пользователь попытается связаться, например, с «/ admin / edit-user», сервер выдаст ошибку 403.

В схеме пользователя у меня есть атрибут под названием роль. Если пользователь является клиентом, значение роли - клиент. и если пользователь является администратором, роль будет иметь значение admin.

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

Вот мои коды:

Это паспорт. js файл, содержащий локальную стратегию проверки учетных данных пользователя.

const LocalStrategy = require('passport-local').Strategy ;
const bcrypt = require('bcryptjs') ;

// Load User Model.
const User = require('../models/User') ;

module.exports = function(passport)
{
    passport.use
    (
        new LocalStrategy
        (
            { 
                usernameField : 'email' 
            },

            (email, password, done) =>
            {
                // Match User.
                User.findOne( { where : { email : email} })
                .then
                (
                    user =>
                    {
                        // If no match.
                        if(!user)
                        {
                            return done
                            (
                                null,
                                false,
                                { message : 'Incorrect email or password. Check your email and password or create an account..'}
                            )
                        }

                        // Match the password.
                        bcrypt.compare
                        (
                            password,
                            user.password,
                            (err, isMatch) =>
                            {
                                if(err) throw err ;

                                if(isMatch)
                                {
                                    // TODO remove unnecesarry attributes
                                    return done(null, user) ; /*, {message: 'Logged In Successfully'}*/
                                }

                                else
                                {
                                    return done
                                    (
                                        null,
                                        false,
                                        { message : 'Incorrect email or password. Check your email and password or create an account..'}
                                    )                                    
                                }
                            }
                        ) ;
                    }
                ) 
                .catch(err => console.log(err))
            }
        ) 
    ) ;

    passport.serializeUser((user, done) => 
    {
        done(null, user.id);
    }) ;

    passport.deserializeUser((id, done) => 
    {
        User.findByPk(id).then(function(user) 
        {
            done(user.errors, user.get());
        }) ;
    }) ;
} ;

Это файл commonRoutes. js для проверки учетных данных пользователя.

const express = require('express') ;

const router = express.Router() ;

const bcrypt = require('bcryptjs') ;
const passport = require('passport') ;

// Calling Models
const User = require('../models/User') ;

// Login Page => GET.
router.get('/login', (req, res) => 
{
    res.render(
                    'login', 

                    {
                        pageTitle : "Login Page" 
                    }
              ) ;
}) ;

// Login Page => POST.
router.post('/login', (req, res, next) => 
{
    const { email, password } = req.body ;

    let errors = [] ;

    // Check required fields

    if (!email || !password) 
    {
        errors.push({ msg: 'Please enter all fields' }) ;
    }

    // Display Errors.
    if (errors.length > 0) 
    {
        res.render(
                        'login', 
                        {
                            pageTitle : "Login Page",
                            errors,
                        }
                  ) ;
    } 

    else 
    {
        passport.authenticate(
                                'local',
                                {
                                    successRedirect: '/admin/dashboard',
                                    failureRedirect: '/login',
                                    failureFlash: true
                                }
                             )(req, res, next) ;
    }
}) ;

module.exports = router ;


Это Файл моего приложения. js, содержащий серверные коды:

const express = require('express') ;
const bodyParser = require('body-parser') ;
const expressLayouts = require('express-ejs-layouts') ;
const flash = require('connect-flash') ;
const session = require('express-session') ;
const passport = require('passport');
const path = require('path') ;

const commonRoutes = require('./routes/commonRoutes') ;
const carRoutes = require('./routes/cars') ;
const userRoutes = require('./routes/users') ;
const adminRoutes = require('./routes/admins') ;

const Car = require('./models/Car') ;
const User = require('./models/User') ;
const Trip = require('./models/Trip') ;

// Passport Config
require('./config/passport')(passport) ;

// DB Config.
const db = require('./config/database') ;

// Creating the express application.
const app = express() ;

// Serving static files.
app.use(express.static(path.join(__dirname, 'public'))) ;

// Express Session
app.use(session(
                    {
                        secret: 'secret',
                        resave: true,
                        saveUninitialized: true,
                    }
               )
        ) ;

User.hasMany(Trip) ;
Car.hasMany(Trip) ;
User.hasMany(Car) ;

// Connect to MySQL
//db.sync({ force : true})
db.authenticate()
    .then( () => 
            {
                console.log('Database connected...') ;
            } 
         )
    .catch( (err) => 
            {
                console.log(err.message) ;
            }
          ) ;

// EJS
app.use(expressLayouts) ;
app.set('view engine', 'ejs') ;

// Bodyparser 
// for parsing application/xwww-
app.use(bodyParser.urlencoded({ extended: false })) ; 

// for parsing application/json
app.use(bodyParser.json()) ; 

// Express Session
app.use(session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true,
})) ;

// Passport middleware
app.use(passport.initialize()) ;
app.use(passport.session()) ;

// Connect Flash
app.use(flash()) ;

// Global variables
app.use((req, res, next) => {
    res.locals.success_msg = req.flash('success_msg');
    res.locals.error_msg = req.flash('error_msg');
    res.locals.error = req.flash('error');
    next();
});

// Routes
app.use('/', commonRoutes) ;
app.use('/car', carRoutes) ;
app.use('/user', userRoutes) ;
app.use('/admin', adminRoutes) ; // Only the admins have permission to access this routes.

const PORT = process.env.PORT || 5000 ;

app.listen(PORT, 'localhost', console.log(`Server is running on port ${PORT}`)) ;

Это файл пользователя. js, содержащий схему пользователя:

const Sequelize = require('sequelize') ; // To create models and schema.

const db = require('../config/database');

const User = 
db.define
(
    'user',
    {
        id : 
        {
            type : Sequelize.INTEGER(10).UNSIGNED ,
            autoIncrement : true,
            allowNull : false,
            primaryKey : true,
            unique: true
        },
        name : 
        {
            type : Sequelize.STRING,
            allowNull : false 
        },
        email : 
        {
            type : Sequelize.STRING,
            allowNull : false
        },
        mobilePhone :
        {
            type : Sequelize.STRING,
            allowNull : false
        },
        birthDate : 
        {
            type : Sequelize.STRING,
            allowNull : false
        },
        password : 
        {
            type : Sequelize.STRING,
            allowNull : false
        },
        status :
        {
            type : Sequelize.BOOLEAN, // true if is active // false if is deleted.
            allowNull : true
        },
        role :
        {
            type : Sequelize.STRING, // Give different access rights if admin or not.
            allowNull : false
        } 
    },
    {
        // By default, sequelize will automatically
        // transform all passed model names (first parameter of define) into plural.
        // if you don't want that, set the following
        freezeTableName : true,

        // Disabled timestamps in sequelize.
        timestamps : false
    }
) ;

module.exports = User ;

Я искал способ применить авторизацию на админских маршрутах. И я прочитал, что я должен использовать JWT (Json Web Token). Я пытался применить JWT, но я не мог этого сделать.

Примечание: я новичок в nodejs и express. js.

...