如何处理 MVC nodejs 服务上的角色(jsonwebtoken,mongoose)

Posted

技术标签:

【中文标题】如何处理 MVC nodejs 服务上的角色(jsonwebtoken,mongoose)【英文标题】:How to deal with roles on a MVC nodejs service (jsonwebtoken,mongoose) 【发布时间】:2018-01-28 21:34:12 【问题描述】:

我正在使用 MVC 模式开发一项服务,并支持 NodeJS、jsonwebtoken 和 MongoDB (mongoose)。在我的应用程序中,我模拟了两个主要参与者:普通用户(可以通过 Facebook、Amazon 或本地注册)、司机(只能通过网站注册)。我还必须对用户和驱动程序之间的事务进行建模,这些事务显然只能由用户和驱动程序通过 CRUD 范式进行修改。

这里贴出用户和司机的模型:

  var userSchema = mongoose.Schema(

  name: String,
  surname: String,
  email: String,
  password: 
      type: String,
      required: true
  
);


var driverSchema = mongoose.Schema(
name: 
    type: String,
    required: true
,
surname: 
    type: String,
    required: true
,
email: 
  type:String,
  required: true,
  unique:true
,
password: 
    type: String,
    required: true,
    minlength: minimum
 );

我的问题在于对端点的身份验证和数据访问。如何区分用户和驱动程序之间的令牌?我应该将此信息添加到令牌的有效负载中吗?

【问题讨论】:

【参考方案1】:

嗯,有几种方法可以解决这个问题。其中一种方法是使用用户的角色签署用户的令牌。由于您已经为不同类型设置了单独的身份验证逻辑,因此您可以轻松地使用特定的 userType 对令牌进行签名。

对于驱动程序,代码应该是这样的:

var driverToken = jwt.sign(email:'xxx@gmail.com', userType: 'driver', 'YOUR_SECRET');

对于普通用户,代码应该是这样的:

var normalToken = jwt.sign(email:'xxx@gmail.com', userType: 'normal', 'YOUR_SECRET');

现在在验证令牌时,您可以这样做:

var user = jwt.verify(TOKEN, 'YOUR_SECRET');

if(user.userType === 'driver') 
  //Hey, you are a driver!

else if(user.userType === 'normal') 
  //Hey, you are normal...

另外,我注意到驱动程序和用户架构几乎相同。我建议你看看mongoose's discriminators。基本上,discriminators 是 mongoose 的模式继承机制。

【讨论】:

这正是我要找的,也非常感谢您的继承建议! 很高兴这有帮助!

以上是关于如何处理 MVC nodejs 服务上的角色(jsonwebtoken,mongoose)的主要内容,如果未能解决你的问题,请参考以下文章

Node js - 如何处理多个异步任务

如何处理来自服务器(节点 js)中表单的数据? [复制]

mongodb 连接如何处理 NodeJS express 服务器中的并发请求?

当事件循环等待数据库操作时,如何处理对 nodejs 服务器的传入请求

如何处理使用 3rd-party 的 restful store api 和 js mvc 框架的安全性?

使用 Express js 作为服务器的客户端(请求标头)如何处理 max-age、min-fresh 和 max-stale HTTP 标头?