有没有办法在Parse Server中使用ACL拒绝访问特定用户或角色的项目?
假设我有一个用户发布更新的社交网络应用。我有一个名为all_users
的角色,所有注册用户都被添加到。此角色可以读取所有更新,除了作者已阻止的用户。
我可以授予对用户/角色的读写访问权限,但通过Parse Dashboard删除读写访问权限会完全删除该条目。
提示将不胜感激。
答案 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);
});
我怀疑,测试失败了。我不是解析权限的专家(虽然学习),但我目前的理解是,没有优先权的概念,所以一旦你通过你的所有人群添加了权限,就没有办法'拒绝'。换句话说,当前的权限模型是添加权限,而不是明确拒绝。
您的用例很有吸引力但是找到适合您的用例的方法会很有趣。通常情况下,要么你需要弄清楚如何添加它以便一般用例也可以接受,或者招募一个能够(不是志愿者,我的舞卡已满)的人:)