【问题标题】:Customer model based on User returns FK property based on userId instead of customerId基于 User 的客户模型基于 userId 而不是 customerId 返回 FK 属性
【发布时间】:2014-09-30 21:53:49
【问题描述】:

与此相关:previous issue

我已经定义了这个模型:

var customer = mongoDev.createModel('customer',
{
    id: {
        type: String,
        id: true
    },
    firstName: String,
    lastName: String,
    badge: String,
    email: String
},
{
    strict: true,
    base: "User"
});

如果我什么都不做,我会得到所有我期望的额外用户端点(登录、注销、accessTokens 等)。但是我的登录结果给了我:

{
  "id": "ssOzK8EswH...",
  "ttl": 1209600,
  "created": "...",
  "userId": "53c6f5d4769ed..."
}

似乎 userId 应该是 customerId。我已经从 models.json 中删除了用户和 accessToken 模型。所以我什至不知道它从哪里获得关系信息,除非它是在某个地方烘焙的。无论如何,如果我尝试调用 /customer/53c6f5d4769ed... 并在标头中提供令牌,我会得到 401。从技术上讲,Id 是正确的,只是 FK 名称错误。

我尝试过类似的东西

var accessToken = mongoDev.createModel('accessToken',{},{base: "AccessToken"});
accessToken.belongsTo(customer, {as: 'customer', foreignKey: 'customerId'});

我认为这改变了我的 FK 名称,但在调用后续端点时我仍然得到 401。

这是我自己到的地方。所以我的问题实际上是这样的:

对我的 authN 使用代码优先而不是“用户”模型我如何连接 accessToken(也是代码优先)?转折是我计划拥有多个身份验证模型(即客户、供应商、员工)。所以真正的问题是我如何连接它以允许每种类型的“用户”获得他们自己的 accessTokens???

清如泥?? ;-)

【问题讨论】:

    标签: javascript loopbackjs strongloop


    【解决方案1】:

    LoopBack 提供基本的 User 和 AccessToken 模型。它们可以扩展为自定义行为,如您在 models.json 中看到的那样。然后可以将模型引用为 app.models.user 和 app.models.accessToken。 userId 是从访问令牌到用户模型的外键,可以重命名为“customerId”。

    要使用“$owner”角色强制执行 ACL,模型实例需要具有“owner”或“userId”属性,或与用户模型的子类有“belongsTo”关系。

    我建议您将问题分成较小的问题。随意张贴到https://groups.google.com/forum/#!forum/loopbackjs

    【讨论】:

      【解决方案2】:

      所以我什至不知道它从哪里获得关系信息,除非它是在某个地方烘焙的。

      关系信息包含在User 模型中。由于您的customer 扩展了User,它也会继承关系。

      我尝试过类似的东西

      var accessToken = mongoDev.createModel('accessToken',{},{base: "AccessToken"}); accessToken.belongsTo(customer, {as: 'customer', foreignKey: 'customerId'});

      无论您的用户模型名称如何,外键都必须是 userId

      var accessToken = mongoDev.createModel('accessToken',{},{base: "AccessToken"});
      accessToken.belongsTo(customer, {as: 'user', foreignKey: 'userId'});
      

      当我尝试编写一个示例应用程序来重现该问题时,该应用程序对我来说很好(使用memorymongodb 连接器进行了测试)。

      var loopback = require('loopback');
      
      var customer = loopback.createModel('customer',
      {
          id: { type: String, id: true },
          firstName: String,
          lastName: String,
          badge: String,
          email: String
      },
      {
          strict: true,
          base: "User"
      });
      
      var app = loopback();
      
      app.dataSource('db', {
       connector: 'mongodb' // or memory
      });
      
      app.model(loopback.AccessToken, { dataSource: 'db' });
      app.model(customer, { dataSource: 'db' });
      
      app.use('/api', loopback.rest());
      app.use('/explorer', require('loopback-explorer')(app));
      app.listen(3000, function() {
        console.log('Explore at http://localhost:3000/explorer');
      });
      

      模块版本:

      loopback@1.10.0
      loopback-datasource-juggler@1.7.1
      loopback-connector-mongodb@1.4.1
      

      对我的 authN 使用代码优先而不是“用户”模型我如何连接 accessToken(也是代码优先)?

      见上面的例子。

      我会计划拥有多个身份验证模型(即客户、供应商、员工)。所以真正的问题是我如何连接它以允许每种类型的“用户”获得他们自己的 accessTokens???

      我认为 LoopBack 现在不支持该功能,请打开 github issue 请求此类功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 2016-07-21
        • 2022-11-08
        • 1970-01-01
        • 2021-05-16
        相关资源
        最近更新 更多