首页 > 解决方案 > 如何在 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 和后端,所以请避免我的愚蠢态度。

标签: expressauthenticationpassport.jsdashboardpassport-local

解决方案


推荐阅读