NIFCLOUD-mbaas / UserCommunity

ニフクラ mobile backend ユーザーコミュニティ
https://mbaas.nifcloud.com/
81 stars 18 forks source link

自分以外のuserレコードは更新してはいけない? #703

Closed DaichiSaito closed 7 years ago

DaichiSaito commented 7 years ago

iOS ver 2.3.4です。

【事象】 現在のログインユーザをユーザAとします。 ユーザAがユーザBのuserレコードに対して更新をかけると、NCMBUser.current()で取得できるオブジェクトがユーザBのもので書き換えられてしまいます。なのでそれ以降NCMBUser.current()を利用すると、ユーザーBのユーザ情報を取得してしまいます。

具体例

(省略・・・)
print(NCMBUser.current()) // -> ユーザAの情報が出力される
userB.incrementKey("LIKE", byAmount: 1) // ユーザBのLIKE情報を1インクリメント
userB.saveInBackground { (error) in // userB
    print(NCMBUser.current()) // -> ユーザBの情報に書き換わる
}

ソースを追ってみたところ、NCMBUserのsaveInBackgroundを呼ぶと以下メソッドも呼ばれ、その中でcurrentUserが上書かれるようです。

NCMBUser.m
/**
 ログインユーザーをファイルに保存する
 @param NCMBUSer型ファイルに保存するユーザー
 */
+ (void) saveToFileCurrentUser:(NCMBUser *)user {
    NSError *e = nil;
    NSMutableDictionary *dic = [user toJSONObjectForDataFile];
    NSData *json = [NSJSONSerialization dataWithJSONObject:dic options:kNilOptions error:&e];
    NSString *strSaveData = [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding];
    [strSaveData writeToFile:DATA_CURRENTUSER_PATH atomically:YES encoding:NSUTF8StringEncoding error:&e];
    currentUser = user;
}

【質問】 NCMBのSDKは、そもそも他人のuserレコードを更新する前提で作られていないということでしょうか。 そうなると今回のようなLIKE等の情報はuserクラスではなく、LIKEクラスを作成しそこに保存していくことになるのでしょうか。

goofmint commented 7 years ago

そうですね、セキュリティの関係上もあり、Userクラスにおいて誰でも更新できるのは良くないかと思います。とは言え、保存するとログインユーザが変わるのはどうかと思いますが…。 後はスクリプトから行うのが良いかと思います。

goofmint commented 7 years ago

良ければiOS SDKでIssue報告をお願いします!

https://github.com/NIFTYCloud-mbaas/ncmb_ios/issues/new

DaichiSaito commented 7 years ago

ありがとうございます。Issue報告しました。