首页 > 解决方案 > 如何让多个用户使用单一路由登录

问题描述

我有一个登录代码。我有 2 个模式,一个是用户和管理员。现在我有两个普通用户和超级管理员的登录路由 url,/login管理员用户和超级管理员也是如此。adminLogin

我只想将这两个模式与单个路由结合起来/login

这是我的/login路线代码,与代码中的/adminLogin唯一区别是用户管理员(架构)相同

router.post('/login' , (req, res, next) => {

    User.find({email: req.body.email})
    .exec()
    .then(user => {
        if(user.length < 1) {
            return res.status(401).json({
                message: "Auth failed. User not found."
            })
        }
        bcrypt.compare(req.body.password, user[0].password, (err, result) =>{
        if (err) {
        return res.json({
                message: "Auth failed. Check email and password"
                });             
            }


            if (result && user[0].isVerified === true){
                const adminEmail = "xyz@temp-mail.com";                                                 
                const role = user[0].email===adminEmail? "superadmin" : "user";     //---- Here in case of Admin schema -> "superadmin" : "admin";
                const token = jwt.sign( 
                    {
                        email: user[0].email,
                        userId: user[0]._id,
                        phoneNo: user[0].phoneNumber,
                        role            
                    },
                    process.env.JWT_KEY,
                    {
                        expiresIn : "1h"
                    });
                    return res.status(200).json({
                    message: "Auth Successful",
                    token : token
                    });
            }
            else{
                console.log("user is not verified");    
                return res.json({
                message: "User is not verified"
                }); 
            }

如何在同一登录功能中将 Admin.find()用于 Admin 架构?

标签: node.jsexpressroutes

解决方案


在不更改架构的情况下,首先像这样重构代码:

function handle(find_func, base_role, req, res, next) {
     find_func( // your original code inside User.find, change "superadmin" : "user" to "superadmin" : base_role
     ...);
}

对于普通用户登录,请致电

handle(User.find, "user", req, res, next);

对于管理员用户登录,调用

handle(Admin.find, "admin", req, res, next);

现在您需要区分登录是来自普通用户还是管理员用户。无需将您的管理员和用户架构合并到一个更大的架构中,其中一个新字段“角色”指示它是普通用户还是管理员用户,您可以查询用户名是否在用户集合中,如果不查询它是否在管理员集合中,然后调用对应handle


推荐阅读