我在Parse有一个成就课,_User可以在我正在进行的游戏中的某个地方获得成就。出于某种原因,没有获得成就的_用户不应该能够看到有关它的信息。
我知道如何在经典数据库模式中实现它(使用多对多关系),但我想知道如何使用为此类事项设计的权限和ACL在Parse中实现它(I只看到如何使用ACL进行一对一的关系。)
我的想法是将一个Relation列添加到_User类。但是如何确保_User只能获得有关他们获得的成就的信息。
我是否有义务将Cloud Code用于此类问题?
答案 0 :(得分:1)
你必须创建一个关联表,或者更好的是,在两个表之间建立一个Parse Relation。
https://parse.com/docs/relations_guide#manytomany
在类中添加关系列,如下所示:
如果存在与指定成就的关系,那么用户可以获得他的信息
修改1
通过ACL,您可以做类似的事情(我使用一些Obj-C代码来解释):
// Having the instance to an existing Achievement object
PFObject* achievement = [PFObject objectWithClassName:kTbAchievements];
[achievement setObjectId:@"mwQipJGpSb"];
[achievement fetch]; // gain full object from Parse server
// Way for get current achievement acl informations
//PFACL* currentAchievementACL = [achievement ACL];
// Creation of ACL for this achivement (just for this example ), otherwise use "
// [achievement ACL]" for getting existing achievement ACL
PFACL* acl = [PFACL ACL]; // Instance of new Acl object
// allowing read access to user with objectId == userId1
[acl setReadAccess:YES forUserId:@"userId1"];
// allowing read access to user with objectId == userId2
[acl setReadAccess:YES forUserId:@"userId2"];
[achievement setACL:acl]; // assign new created ACL obj
[achievement save]; // updating the achievement
// check for user authorizations
BOOL check1 = [acl getReadAccessForUserId:@"userId1"]; // YES, granted
BOOL check2 = [acl getReadAccessForUserId:@"userId2"]; // YES, granted
BOOL check3 = [acl getReadAccessForUserId:@"userId3"]; // NO, denied
这是您在所选成就的仪表板中的内容
希望有所帮助
答案 1 :(得分:0)
您是否担心用户攻击Parse数据库以了解他们没有的成就?如果是这样,那么ACL是一个很好的解决方案。 ACL是为了解决安全问题。
如果您希望他们只看到他们在游戏的UI中拥有的成就,那么我只需使用关系来链接成就。这将是一个过滤问题。
您需要问自己这是安全问题还是过滤问题。