express - 如何在 Expressjs 中实现 3 Diff Passport 本地策略
问题描述
希望你身体健康,做得很好,我正在将旅游申请作为我在 Express js 研究生学位的最后一个项目。我必须使用 3 个不同的仪表板 [Blogger、Event Organsiior 和 Tourist] 用于完全不同的目的。
我应该如何使用 3 种不同的本地策略,所以如果用户使用电子邮件和密码,所以他/她重定向到他们的仪表板根据他们使用注册定义的角色人,
我已经附加了数据库架构、控制器和 App.js 目前,成功登录后,我渲染到名为 Profile 的演示页面
/****数据库架构*****/
const mongoose = require ("mongoose");
const userSchema=new mongoose.Schema({
fname:{
type:"String",
},
lname:{
type:"String"
},
username:{
type:"String",
unique:true
},
email:{
type:"String",
unique:true,
},contact:{
type:"String",
unique:true,
},
roleperson:{
type:"String"
},
gender:{
type:"String"
},
password:{
type:"String"
},
cpassword:{
type:"String"
},
isVerified: {
type: Boolean,
default: false,
},
googleId: {
type: String,
},
provider: {
type: String,
required: true,
}
})
// Model i.e Collection creation should be
const user =new mongoose.model("User", userSchema);
module.exports=user;
/****Passportjs 控制器 *****/
const user = require('../model/user');
const bcryptjs = require('bcryptjs');
var localStrategy = require('passport-local').Strategy;
module.exports = function (passport) {
passport.use(new localStrategy({ usernameField: 'email' }, (email, password, done) => {
user.findOne({ email: email }, (err, data) => {
if (err) throw err;
if (!data) {
return done(null, false, { message: "User Doesn't Exist !" });
}
bcryptjs.compare(password, data.password, (err, match) => {
if (err) {
return done(null, false);
}
if (!match) {
return done(null, false, { message: "Password Doesn't match !" });
}
if (match) {
return done(null, data);
}
})
})
}));
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
user.findById(id, function (err, user) {
done(err, user);
});
});
}
/****routerjs 控制器 *****/
const express = require('express');
const router = express.Router();
const bcryptjs = require('bcryptjs');
const passport = require('passport');
require('./passportLocal')(passport);
require('./googleAuth')(passport);
const userRoutes = require('./accountRoutes');
const path=require('path')
const static_path = path.join(__dirname, '../../public')
function checkAuth(req, res, next) {
if (req.isAuthenticated()) {
res.set('Cache-Control', 'no-cache, private, no-store, must-revalidate, post-check=0, pre-check=0');
next();
} else {
req.flash('error_messages', "Please Login to continue !");
res.redirect('/login');
}
}
// Getting the collection of DB
const NewsletterSubsciber = require('../model/newsletter')
const ContactUs_Client = require("../model/contactus")
const user =require('../model/user')
router.post('/signup', (req, res) => {
// get all the values
const {fname,lname,gender,roleperson,email,contact, username, password, cpassword } = req.body;
// check if the are empty
if (!fname || !lname || !gender || !roleperson || !email ||!contact || ! username || !password || !cpassword) {
res.render("signup", { err: "All Fields Required !" });
} else if (password != cpassword) {
res.render("signup", { err: "Password Don't Match !" });}
else if (password.length<8) {
res.render("signup", { err: "Password Must be atleast 8 charchter!" });
} else {
// validate email and username and password
// skipping validation
// check if a user exists
user.findOne({ $or: [{ email: email }, { username: username },{ contact: contact }] }, function (err, data) {
if (err) throw err;
if (data) {
res.render("signup", { err: "User already Exists, Try Logging In !" });
} else {
// generate a salt
bcryptjs.genSalt(12, (err, salt) => {
if (err) throw err;
// hash the password
bcryptjs.hash(password, salt, (err, hash) => {
if (err) throw err;
// save user in db
user({
fname:fname,
lname:lname,
gender:gender,
roleperson:roleperson,
username: username,
contact: contact,
email: email,
password: hash,
googleId: null,
provider: 'email',
}).save((err, data) => {
if (err) throw err;
// login the user
// use req.login
// redirect , if you don't want to login
res.redirect('/login');
});
})
});
}
});
}
});
router.post('/login', (req, res, next) => {
passport.authenticate('local', {
failureRedirect: '/login',
successRedirect: '/profile',
failureFlash: true,
})(req, res, next);
});
router.get('/logout', (req, res) => {
req.logout();
req.session.destroy(function (err) {
res.redirect('/');
});
});
// Authenication Form Google but that is ignore in Our Project
router.get('/google', passport.authenticate('google', { scope: ['profile', 'email',] }));
router.get('/google/callback', passport.authenticate('google', { failureRedirect: '/login' }), (req, res) => {
res.redirect('/profile');
});
router.post('/index', async (req, res) => {
try {
const newlettersubsciber = new NewsletterSubsciber({
email: req.body.email,
})
const dataenter = await newlettersubsciber.save();
res.status(201).render("index",{ err: "Request is Send Succesfully"});
} catch (error) {
res.sendStatus(400).send(error)
console.log(`The Error is:${error}`)
}
})
router.post('/contact', async (req, res) => {
try {
const contact_client = new ContactUs_Client({
name: req.body.name,
email: req.body.email,
textaera: req.body.textaera,
phone: req.body.phone,
})
const dataenter = await contact_client.save();
res.status(201).render("index");
} catch (error) {
res.sendStatus(400).send(error)
console.log(`The Error is:${error}`)
}
})
router.get('/profile', checkAuth, (req, res) => {
// adding a new parameter for checking verification
res.render('profile', { username: req.user.username, verified : req.user.isVerified });
});
// All static Pages Of Website
router.get('/', (req, res) => {
if (req.isAuthenticated()) {
res.render("index", { logged: true });
} else {
res.render("index", { logged: false });
}
});
router.get('/login', (req, res) => {
res.render("login");
});
router.get('/signup', (req, res) => {
res.render("signup");
});
router.get('/contact', (req, res) => {
res.render("contact")
})
router.get('/findevent', (req, res) => {
res.render("FindEvent")
})
router.get('/blogs', (req, res) => {
res.render("Blogs")
})
router.use('/about', (req, res) => {
res.sendFile(static_path + "/pages/About.html")
})
router.use('/rentaroom', (req, res) => {
res.sendFile(static_path + "/pages/Rentaroom.html")
})
router.use('/touristguider', (req, res) => {
res.sendFile(static_path + "/pages/touristguider.html")
})
router.use('/eventorganizerpolicy', (req, res) => {
res.sendFile(static_path + "/pages/event_org_policy.html")
})
router.use('/bloggerpolicy', (req, res) => {
res.sendFile(static_path + "/pages/Blogger_policy.html")
})
router.use('/touristpolicy', (req, res) => {
res.sendFile(static_path + "/pages/Tourist_policy.html")
})
router.use('/touristguiderpolicy', (req, res) => {
res.sendFile(static_path + "/pages/TouristGuider_policy.html")
})
router.use('/privacypolicy', (req, res) => {
res.sendFile(static_path + "/pages/Privacy_Policy.html")
})
router.use('/safteypolicy', (req, res) => {
res.sendFile(static_path + "/pages/Safety_Policy.html")
})
router.use('/copywritepolicy', (req, res) => {
res.sendFile(static_path + "/pages/Copywrite_policy.html")
})
router.use('/tod', (req, res) => {
res.sendFile(static_path + "/pages/TOD.html")
})
router.use('/faqs', (req, res) => {
res.sendFile(static_path + "/pages/FAQS.html")
})
// BloggerDashboard Routes
router.get('/bloggerdashboard', function (req, res) {
res.render('blogger_dash/index', {});
})
router.get('/bloggerdashboard/addnewpost', function (req, res) {
res.render('blogger_dash/add-new-post', {});
})
router.get('/bloggerdashboard/auduience', function (req, res) {
res.render('blogger_dash/auduience', {});
})
router.get('/bloggerdashboard/blogspost', function (req, res) {
res.render('blogger_dash/components-blog-posts', {});
})
router.get('/bloggerdashboard/userprofile', function (req, res) {
res.render('blogger_dash/user-profile-lite', {});
})
// Event Org Dashboard Routes
router.get('/eventorgdashboard', function (req, res) {
res.render('eventOrg_dash/index', {});
})
router.get('/eventorgdashboard/create_event', function (req, res) {
res.render('eventOrg_dash/create_an_event', {});
})
router.get('/eventorgdashboard/invoicelist', function (req, res) {
res.render('eventOrg_dash/invoicelist', {});
})
router.get('/eventorgdashboard/profile', function (req, res) {
res.render('eventOrg_dash/profile', {});
})
router.get('/eventorgdashboard/userlist', function (req, res) {
res.render('eventOrg_dash/userlist', {});
})
//Tourist Org Dashboard Routes
router.get('/touristdashboard', function (req, res) {
res.render('tourist_dash/index', {});
})
router.get('/touristdashboard/previousevent', function (req, res) {
res.render('tourist_dash/previousevent', {});
})
router.get('/touristdashboard/touristprofile', function (req, res) {
res.render('tourist_dash/touristprofile', {});
})
router.use(userRoutes);
module.exports = router;
我知道这篇文章很长。我只学习了一个月的 Expressjs 和后端,所以请避免我的愚蠢态度。
解决方案
推荐阅读
- postgresql - 如何在 Heroku 上使用 PostgreSQL 作为数据库部署 FastAPI 应用程序
- r - 按 R 中 row.names 中的值对数据框行进行子集
- amazon-cognito - 将 Pinpoint 添加到不同区域的 Cognito
- r - 无法估计 ARIMA 模型 R 预测包中的错误 - auto.arima
- tensorflow - 循环初始化器做什么?
- dart - “AES 引擎未初始化”与 pointycastle SecureRandom()
- reactjs - 如何为反应顶点图表中的每个条分配不同的颜色?
- api - 为什么 Power BI HTTP 响应表明我已达到最大数据流刷新次数?
- aws-lambda - AWS Api 网关:后处理
- php - 如何在不同的地方使用变量?