首页 文章

如何使用环回来保护不同角色的属性

提问于
浏览
5

我只是想知道如何限制对$ owner角色的属性访问 . 例如在我的情况下,我有一个有作者的笑话 . 作者以用户为基础 . 我希望其他“Authers”/用户看到谁创建了笑话,但是他们不应该看到Authers的电子邮件,只有当作者是笑话本身的$所有者时才可以显示他们的电子邮件,只是为了这个案子 .

查看内置的用户模型,您可以看到他们使用隐藏的功能来隐藏密码,但是使用它来保存他们的电子邮件也会隐藏他们的电子邮件给$ owner,这不是我想要的

如果有什么不清楚,请告诉我 .

提前致谢

3 回答

  • -1

    注册beforeRemote hook并检查当前用户是否为$owner .

    Joke.boforeRemote('findById', function(context, joke, next) {
      // 1. find current user by id, using context.req.accessToken.userId
      // 2. check if he is owner or not, by Role.isOwner
      // 3. remove email from returned joke instance if user is not $owner
    })
    

    注意:覆盖所有返回Jokes的 endpoints 可能有点复杂 . 但还有另一种方法吗?

  • 2

    要修改 output / results,可以使用 afterRemote 钩子,根据docs . 输出/结果存储在ctx.result中 .

    当呼叫类似于 GET http://myModel/id 时,'findById'挂钩到您的GET请求中 . 如果您的请求中未包含ID,请使用'find',例如 GET http://myModel . 请注意,在'find'的情况下,返回的实例(笑话)通常不只是一个,因此它在一个对象数组中 .

    Joke.afterRemote('findById', function(ctx, joke, next) {
      //your code
    });
    
    • 获取当前登录用户的ID: var currentUser = context.req.accessToken.userId

    • 将当前登录用户的用户ID与笑话所有者的用户ID进行比较 . 如果两者不相同(即 if (!(currentUser == joke.userId)) ),那么:
      在调用next()之前

    • ,从返回的笑话实例中删除email属性 . 因为有时某些方法不起作用,这里有几个:

    • delete ctx.result.email;

    • ctx.result.email = '';

    • 循环遍历属性并将它们传输到新的var,除了电子邮件,然后保存新的var结果: ctx.result = newVar;

  • 1

    您可以创建自己的角色解析器 . 有关示例,请参阅https://github.com/strongloop/loopback-example-access-control/blob/master/server/boot/role-resolver.js . 确定用户后,只需添加自己的逻辑 .

相关问题