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

时间:2015-01-20 14:39:50

标签: node.js loopbackjs

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

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

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

提前致谢

3 个答案:

答案 0 :(得分:2)

注册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的端点可能有点复杂。但还有另一种方法吗?

答案 1 :(得分:1)

要修改输出 /结果,您可以按照docs使用 afterRemote 挂钩。输出/结果存储在ctx.result

' findById'当呼叫类似@SuppressWarnings("serial") class MyRenderer extends DefaultTableCellRenderer { private static final int ALPHA = 60; private Color chefColor; private Color defaultColor; public MyRenderer(Color chefColor, Color defaultColor) { this.chefColor = chefColor; this.defaultColor = defaultColor; setOpaque(true); setHorizontalAlignment(SwingConstants.CENTER); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component superComp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (value != null) { MyTableModel tableModel = (MyTableModel) table.getModel(); boolean chef = tableModel.getEmployee(row).isChef(); Color c = chef ? chefColor : defaultColor; if (!hasFocus && !isSelected) { c = new Color(c.getRed(), c.getGreen(), c.getBlue(), ALPHA); } superComp.setBackground(c); } return superComp; } } 时,挂钩到您的GET请求中。使用'找到'如果您未在请求中包含该ID,例如GET http://myModel/id。请注意,在' find'的情况下,返回的实例(笑话)通常不只是一个,因此它在一个对象数组中。

GET http://myModel
  1. 获取当前登录用户的ID:Joke.afterRemote('findById', function(ctx, joke, next) { //your code });
  2. 将当前登录用户的用户ID与笑话所有者的用户ID进行比较。如果两者不相同(即var currentUser = context.req.accessToken.userId),则:
  3. 在调用next()之前,从已返回的笑话实例中删除email属性。因为有时某些方法不起作用,这里有几个:

    • if (!(currentUser == joke.userId))
    • delete ctx.result.email;
    • 循环遍历属性并将其转移到新的var(电子邮件除外),然后将新的var保存到结果中:ctx.result.email = '';

答案 2 :(得分:-1)

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