Я пытаюсь разработать веб-приложение, которое состоит из информационной панели для клиентов и информационной панели для администраторов. В админ-панели есть маршруты для изменения и удаления пользователя. И я должен держать административные маршруты в безопасности. Поэтому, если пользователь попытается связаться, например, с «/ 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.