羽毛-将服务响应限制为仅当前用户拥有的数据

Mat*_*tty 6 hook feathersjs

在Feathers中,目标是将某些服务上可访问的数据限制为仅由当前登录用户拥有的数据。

假设我使用的是Feathers身份验证,此服务上可用的数据存储在数据库表中,并且包含用户ID的表列称为user_id,此钩子是否可以实现目标?

如果没有,那么需要改变什么?

如果能够回答这个问题很重要,那么我正在使用Sequelize和Postgres。

const { authenticate } = require('feathers-authentication').hooks;

const { queryWithCurrentUser } = require('feathers-authentication-hooks');
const { associateCurrentUser } = require('feathers-authentication-hooks');

const readRestrict = [
  queryWithCurrentUser({
    idField: 'id',
    as: 'user_id'
  })
];

const modRestrict = [
  associateCurrentUser({
    idField: 'id',
    as: 'user_id'
  })
];

module.exports = {
  before: {
    all:    [ authenticate('jwt') ],
    find:   [ ...readRestrict ],
    get:    [ ...readRestrict ],
    create: [ ...modRestrict ],
    update: [ ...modRestrict ],
    patch:  [ ...modRestrict ],
    remove: [ ...modRestrict ]
  },

  after: {
    all:    [],
    find:   [],
    get:    [],
    create: [],
    update: [],
    patch:  [],
    remove: []
  },

  error: {
    all:    [],
    find:   [],
    get:    [],
    create: [],
    update: [],
    patch:  [],
    remove: []
  }
};
Run Code Online (Sandbox Code Playgroud)

这似乎可行,但是由于我是Feathers菜鸟,因此我认为最好在进行检查之前先进行检查,以确保没有任何我不知道会导致泄漏的情况。

Use*_*ser 0

作为羽毛和表达的初学者,我不确定。现在,一切都按上述方式进行。

旧答案

对于remove,我用过restrictToOwner。(我也认为 forpatchupdate因为它们对现有数据进行操作。不过我没有测试这一点。)否则我可以通过指定 id 来交叉删除数据。也许您可以检查一下您是否也遇到这种情况。

这是测试用例:

  1. 用户 1 创建一个模型对象
    • 用于检查授权的用户 ID
    • 用于识别对象的对象 ID
  2. 用户2删除具有对象id的对象
    • 测试正常:预期 404
    • 测试失败:204 或 200 有效
  3. 用户1尝试获取该对象
    • 测试正常:对象存在,200
    • 测试失败:对象不存在,404

测试代码:

非常感谢您,您的帖子对我真的很有帮助!