【问题标题】:Parse.com master key doesn't let to write PFUser currentUserParse.com 主密钥不允许写入 PFUser currentUser
【发布时间】:2014-08-26 15:59:49
【问题描述】:

更新:简而言之,我想使用主密钥,因为我需要用我当前的用户编写另一个用户对象,但我不想覆盖所有安全性,我只想使用它功能。 this question 中接受的答案给出了一个很好的起点,但是我无法让它工作。这是本题的最后一个代码块。


我有两个独立的功能。第一个是纯objective-c,它从currentUser的firstRelation中删除用户。在我将不同的 CloudCode 函数添加到不同的视图控制器之前,它运行良好,没有任何问题。 CloudCode函数使用主密钥并将currentUser添加到otherUser的sampleRelation并将otherUser添加到currentUser的sampleRelation(firstRelation和sampleRelation是@内的两个不同列987654332@类)。

所以问题是当我从currentUser 的firstRelation (与当前用户)中删除用户时,我的应用程序崩溃,因为用户必须通过登录或注册进行身份验证。实际上我不明白这一点,因为在这种情况下,我用currentUser而不是另一个用户编写currentUser,所以它必须没有任何问题(并且在CloudCode之前工作)。

我几乎可以肯定这是因为我在 CloudCode 中使用了主密钥,但不知道如何才能避免它。其他一切都还在工作,例如我可以使用currentUser 上传图片。

这是我用于 CloudCode 的代码,JavaScript 对我来说完全未知,也许有人会看到导致问题的原因。

Parse.Cloud.define('editUser', function(request, response) {
Parse.Cloud.useMasterKey();

var userQuery = new Parse.Query(Parse.User);

userQuery.get(request.params.userId)
.then(function (user) {
    var relation = user.relation("sampleRelation");
    relation.add(request.user);
    // chain the promise
    return user.save();
}).then(function (user) {
    var currentUser = request.user;
    var relation = currentUser.relation("sampleRelation");
    relation.add(user);
    // chain the new promise
    return currentUser.save();
}).then(function () {
    response.success();
}, function (error) {
    response.error(error);
});
});

当我尝试移除对象时它崩溃了:

PFUser *user = [self.friends objectAtIndex:indexPath.row];
    PFRelation *myFriendsRel = [self.currentUser relationForKey:@"simpleRelation"];

    if ([self isFriend:user]) {

        for (PFUser *friendName in self.friends) {
            if ([friendName.objectId isEqualToString:user.objectId]){ 
                [self.friends removeObject:friendName];
                break; // to exit a loop
            }
        }
        // remove from parse

        [myFriendsRel removeObject:user];
        NSLog(@"deleted: %@", user.username);


    }
    [self.currentUser saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (error){
            NSLog(@"Error %@ %@", error, [error userInfo]);
        }
    }];

这是最新的尝试,基于 Fosco 对另一个问题的回答。它可以工作,但与早期版本相同。

  Parse.Cloud.define('editUser', function(request, response) {
                                   var userId = request.params.userId;

                                   var User = Parse.Object.extend('_User'),
                                   user = new User({ objectId: userId });

                                   var currentUser = request.user;

                                   var relation = user.relation("friendsRelation");
                                   relation.add(currentUser);


                                   user.save(null, { useMasterKey:true}).then(function(user) {
                                                    response.success(user);
                                                    }, function(error) {
                                                    response.error(error)
                                                    });
                                   });

【问题讨论】:

  • 目前还不清楚失败的地方..
  • @Fosco 抱歉,我忘记添加了。添加的代码运行良好,没有任何问题,直到我开始使用云代码。
  • 仍然不清楚,一点也不。
  • @Fosco 我创建了一个函数,允许当前用户将另一个用户添加到他的朋友列表中。如果当前用户点击添加朋友按钮,我会将sampleUser 分配给他的朋友列表(sampleRelation),并将currentUser 分配给sampleUser 的朋友列表。由于安全原因,我无法写sampleUser 的sampleRelation,因此我开始使用带有 CloudCode 的主密钥。有了新的 CC 功能,我可以写另一个用户的sampleRelation,但它引发了另一个问题。我在名为firstRelation 的用户类上有另一个PFRelation。这就像最爱..
  • @Fosco 当前用户可以添加其他用户到此列表,但不会添加到其他用户的收藏夹。当前用户自然可以从收藏列表中删除用户,该功能在 CC 功能之前已经实现并且运行良好。现在它不起作用并给出错误,因为我使用的是主密钥。

标签: javascript objective-c parse-platform


【解决方案1】:

乍一看,它似乎失败了,因为您试图在迭代时从数组中删除一个对象。我知道这会导致 Objective C 崩溃,无论您是否使用 Parse 对象。

尝试重写此段:

        for (PFUser *friendName in self.friends) {
        if ([friendName.objectId isEqualToString:user.objectId]){ 
            [self.friends removeObject:friendName];
            break; // to exit a loop
        }
    }

到这样的事情:

    NSMutableArray *tempArray = [[NSMutableArray alloc]init];
    for (PFUser *friendName in self.friends) {
        if (![friendName.objectId isEqualToString:user.objectId]) {
        [tempArray addObject:friendName];
    }
    self.friends = [NSArray arrayWithArray:tempArray];

再次,只是快速浏览了一下,所以不是 100% 如果这是您的问题,但看起来是这样,如果有帮助,请告诉我

【讨论】:

  • 感谢您的努力,我重新创建了项目,它运行良好,但仍然不知道问题出在哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多