拒绝使用ACL访问用户/角色

时间:2017-08-31 09:47:06

标签: parse-server

有没有办法在Parse Server中使用ACL拒绝访问特定用户或角色的项目?

假设我有一个用户发布更新的社交网络应用。我有一个名为all_users的角色,所有注册用户都被添加到。此角色可以读取所有更新,除了作者已阻止的用户。

我可以授予对用户/角色的读写访问权限,但通过Parse Dashboard删除读写访问权限会完全删除该条目。

提示将不胜感激。

1 个答案:

答案 0 :(得分:1)

我不是100%肯定答案,所以我做了我通常做的事情,进行单元测试来弄明白。

实际上,我正在制作一个PR以创建一个“所有用户角色”,这将改善您当前的解决方案,特别是如果您的社交网络起飞并且您拥有许多用户。

查看问题:https://github.com/parse-community/parse-server/issues/4107

您可以在此处跟踪我的解决方案的当前状态(当前有效,但尚未准备合并):https://github.com/parse-community/parse-server/pull/4111

但我正在努力的是“所有用户角色”案例,而不是“拒绝用户”案例。

我测试你的问题所做的是扩展我的pr的单元测试以解决你的特定(有趣的)用例:

it('should respect for read.', function (done) {
  let role, user;

  const userP = new Parse.User()
    .set('username', 'userA')
    .set('password', 'password')
    .save()
    .then((user) => Parse.User.logIn(user.get('username'), 'password'));

  const roleP = new Parse.Role('aRole', new Parse.ACL())
    .save();

  Parse.Promise.when(userP, roleP)
    .then((newUser, newrole) => {
      user = newUser;
      role = newrole;
      const acl = new Parse.ACL();
      acl.setRoleReadAccess(role, true);
      return new Parse.Object('Foo')
        .setACL(acl)
        .save();
    })
    .then(() => new Parse.Query('Foo').first())
    .then((obj) => {
      expect(obj).not.toBeDefined();
      return new Parse.Query(Parse.Role)
        .equalTo('name', '_All_Role')
        .first()
    })
    .then((allRole) => {
      expect(allRole).toBeDefined();

      const roles = role.relation('roles');
      roles.add(allRole);
      return role.save(null, { useMasterKey: true });
    })
    .then(() => new Parse.Query('Foo').first())
    .then((obj) => {
      expect(obj).toBeDefined();
      const acl = obj.getACL();
      acl.setReadAccess(user.id, false); // <--- this is what you want!!!
      console.log(acl);
      const valid = obj.setACL(acl);
      expect(valid).toBe(true);
      return obj.save();
    })
    .then(() => new Parse.Query('Foo').first())
    .then((obj) => {
      expect(obj).not.toBeDefined(); // <--- but this fails :(....
      done();
    })
    .catch(done.fail);
});

我怀疑,测试失败了。我不是解析权限的专家(虽然学习),但我目前的理解是,没有优先权的概念,所以一旦你通过你的所有人群添加了权限,就没有办法'拒绝'。换句话说,当前的权限模型是添加权限,而不是明确拒绝。

您的用例很有吸引力但是找到适合您的用例的方法会很有趣。通常情况下,要么你需要弄清楚如何添加它以便一般用例也可以接受,或者招募一个能够(不是志愿者,我的舞卡已满)的人:)