使用 ACL 拒绝 user/role 的访问
Deny access for user/role with ACL
是否有任何方法可以在 Parse Server 中使用 ACL 来拒绝特定用户或角色对项目的访问?
假设我有一个社交网络应用程序,用户 post 更新。我有一个名为 all_users
的角色,所有注册用户都被添加到该角色。此角色可读取所有更新,作者已阻止的用户除外。
我可以授予对 users/roles 的读取和写入访问权限,但是通过 Parse Dashboard 删除读取和写入访问权限会完全删除该条目。
不胜感激。
我不是 100% 确定答案,所以我做了我通常做的事情,进行单元测试以找出答案。
碰巧,我正在做一个 PR 来创建一个 'all user role' 来改进你当前的解决方案,尤其是当你的社交网络起飞并且你有很多用户的时候。
查看问题:https://github.com/parse-community/parse-server/issues/4107
您可以在此处跟踪我的解决方案的当前状态(目前有效,但尚未准备好合并):https://github.com/parse-community/parse-server/pull/4111
但我正在处理的是 'all user role' 案例,而不是您需要的 'deny a user' 案例。
我为测试您的问题所做的是从我的公关扩展单元测试以解决您的特定(有趣)用例:
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);
});
如我所料,测试失败。我不是解析权限方面的专家(虽然在学习),但我目前的理解是,没有优先级的概念,所以一旦你通过你的每个人组添加了权限,就没有办法 'deny'。换句话说,当前的权限模型是添加权限,而不是显式拒绝。
尽管您的用例很有吸引力,但找到一种方法来适应您的用例会很有趣。通常情况下,要么你需要弄清楚如何以一种对一般用例也可接受的方式添加它,要么招募可以的人(不是自愿的,我的舞蹈卡已满:).
是否有任何方法可以在 Parse Server 中使用 ACL 来拒绝特定用户或角色对项目的访问?
假设我有一个社交网络应用程序,用户 post 更新。我有一个名为 all_users
的角色,所有注册用户都被添加到该角色。此角色可读取所有更新,作者已阻止的用户除外。
我可以授予对 users/roles 的读取和写入访问权限,但是通过 Parse Dashboard 删除读取和写入访问权限会完全删除该条目。
不胜感激。
我不是 100% 确定答案,所以我做了我通常做的事情,进行单元测试以找出答案。
碰巧,我正在做一个 PR 来创建一个 'all user role' 来改进你当前的解决方案,尤其是当你的社交网络起飞并且你有很多用户的时候。
查看问题:https://github.com/parse-community/parse-server/issues/4107
您可以在此处跟踪我的解决方案的当前状态(目前有效,但尚未准备好合并):https://github.com/parse-community/parse-server/pull/4111
但我正在处理的是 'all user role' 案例,而不是您需要的 'deny a user' 案例。
我为测试您的问题所做的是从我的公关扩展单元测试以解决您的特定(有趣)用例:
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);
});
如我所料,测试失败。我不是解析权限方面的专家(虽然在学习),但我目前的理解是,没有优先级的概念,所以一旦你通过你的每个人组添加了权限,就没有办法 'deny'。换句话说,当前的权限模型是添加权限,而不是显式拒绝。
尽管您的用例很有吸引力,但找到一种方法来适应您的用例会很有趣。通常情况下,要么你需要弄清楚如何以一种对一般用例也可接受的方式添加它,要么招募可以的人(不是自愿的,我的舞蹈卡已满:).