Изменение поля в PFUser из другого PFUser, Parse iOS
Я пытаюсь изменить значение другого поля PFUser, с другого PFUser, не прошедшего проверку подлинности в Parse, однако, похоже, я не могу этого сделать. Я пытаюсь увеличить количество часов одного пользователя от другого. Вот как я пытаюсь это сделать:
PFUser *currentUser = [PFUser currentUser];
PFACL *ACL = [PFACL ACLWithUser:[PFUser currentUser]];
[ACL setPublicReadAccess:YES];
PFUser *selectedUser = [self.formValues objectForKey:@"user"];
NSLog(@"User ID: %@", selectedUser.objectId);
PFObject *volunteerSheet = [PFObject objectWithClassName:@"VolunteerSheet"];
volunteerSheet[@"userID"] = selectedUser.objectId;
volunteerSheet[@"fromID"] = currentUser.objectId;
volunteerSheet[@"volunteerTitle"] = [self.formValues objectForKey:@"title"];
volunteerSheet[@"location"] = [self.formValues objectForKey:@"location"];
volunteerSheet[@"volunteerHours"] = [self.formValues objectForKey:@"hours"];
volunteerSheet[@"volunteerDescription"] = [self.formValues objectForKey:@"description"];
volunteerSheet.ACL = ACL;
[volunteerSheet saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (succeeded) {
// The object has been saved.
PFQuery *query = [PFQuery queryWithClassName:@"_User"];
// Retrieve the object by id
[query getObjectInBackgroundWithId:selectedUser.objectId
block:^(PFObject *user, NSError *error) {
[user incrementKey:@"volunteerHours" byAmount:(NSNumber*)[self.formValues objectForKey:@"hours"]];
[user saveInBackgroundWithBlock:^(BOOL succeeded, NSError * _Nullable error) {
if (succeeded) {
NSLog(@"Succeeded");
}else{
NSLog(error.description);
}
}];
}];
NSLog(@"Saved");
[self dismissViewControllerAnimated:YES completion:^{
UIAlertView * alert =[[UIAlertView alloc ] initWithTitle:@"Success!"
message:@"Hours Sent succesfully."
delegate:self
cancelButtonTitle:nil
otherButtonTitles: nil];
[alert addButtonWithTitle:@"Okay"];
[alert show];
}];
} else {
// There was a problem, check error.description
NSLog(@"Error: %@",error.description);
}
}];
2 ответа
Для пользователей автоматически устанавливается защита, запрещающая изменение другого пользователя (clps или alcs). Может быть, рассмотреть возможность перехода к облачному коду и вызова использовать мастер-ключ?
У пользователей есть ACL, настроенные так, чтобы они могли только изменять свои значения. Чтобы обойти это, вам нужно либо изменять ACL каждый раз, когда вы создаете пользователя, чтобы разрешить любому пользователю иметь права на запись для него (ОЧЕНЬ ОПАСНО И НЕ БЕЗОПАСНО), либо вам нужно вызвать облачную функцию, которая вызывает Parse.Cloud.useMasterKey()
, который отменяет все разрешения, и позволит вам вносить изменения. Очевидно, что вы все равно должны выполнять какую-то проверку безопасности, чтобы убедиться, что эти изменения разрешены / правильные изменения перед их выполнением.