You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js Mongoose 登录前如何查询MongoDB用户角色并跳转对应页面

解决方案

1. 前置校验:确认用户Schema存储了角色字段

首先确保你定义userSchema时包含了role字段,且注册流程已正确将用户角色写入数据库,示例字段定义如下:

userSchema.add({
  role: {
    type: String,
    enum: ['user', 'seller', 'admin'], // 限制可选角色为你预设的三类
    default: 'user' // 默认普通用户
  }
})

2. 清理冗余参数:调整登录静态方法

你当前定义的login静态方法中role参数完全冗余,不需要前端传递角色(前端传参可篡改,不安全),且你通过邮箱查询到的user对象本身就包含数据库中存储的role属性,直接使用即可,调整后静态方法如下:

// 删掉多余的role参数
userSchema.statics.login = async function (email, password) {
  const user = await this.findOne({ email });

  if (user) {
    const auth = await bcrypt.compare(password, user.password);
    if (auth) {
      return user;
    }
    throw Error("incorrect password");
  }
  throw Error("incorrect email");
};

const ClientModel = mongoose.model("client", userSchema, "users");

3. 新增角色跳转逻辑:修改登录控制器

首先修正你控制器中的命名错误:你定义的模型是ClientModel,控制器中错误写成了LoginModel,需先统一。之后拿到返回的user对象后直接读取role字段做跳转判断即可:

module.exports.clientSignIn = async (req, res) => {
  const { email, password } = req.body;
  
  try {
    // 修正模型命名
    const user = await ClientModel.login(email, password);
    const token = createToken(user._id);
    res.cookie("jwt", token, { httpOnly: true, maxAge });
    // 按角色跳转对应页面
    switch(user.role) {
      case 'seller':
        return res.redirect('/seller/dashboard'); // 替换为你的卖家专属页面路径
      case 'admin':
        return res.redirect('/admin/management'); // 替换为你的管理员页面路径
      default:
        return res.redirect('/success'); // 普通用户默认跳转路径
    }
  } catch (err) {
    console.log(err.message);
    // 补充错误响应,避免请求挂起
    return res.status(400).render('login', { error: err.message });
  }
};

注意事项

  • 所有角色判断完全以数据库查询结果为准,不要依赖前端传参,避免被篡改权限
  • 如果后续需要在其他页面校验角色,也可以把role字段加密到jwt中,解密后直接读取不用重复查库

内容的提问来源于stack exchange,提问作者fr_aken_7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:51:02