8

Parse でエンティティを管理するには、現在ログインしているユーザーに関連付ける必要があるオブジェクトが多数あります。

私の懸念は次のとおりです。

  1. User渡されるのが現在ログインしているユーザーであることを保証するバックエンド コードはありません。
  2. ユーザーは、新しく作成されたオブジェクトを他のユーザーに割り当てることができます。

この TODO アプリの例では、ドキュメントにCloud Code が配置されていないことが示されており、 が現在ログインしているユーザーに割り当てられてUserいることを確認しています。Todo

コードに目を通した今、オブジェクトが保存されるたびにユーザーに関連付けられると考え始めています。このアプリケーションが機能する理由と、 を に関連付ける方法を説明できる人はTodoUserますか?

更新:気にしないでください。コード内で、Todo 用に保存するユーザーを指定する場所を見つけました。私の質問は、ユーザーが他のユーザー ID で todo を保存するコードを書くのを妨げているのは何ですか?

this.todos.create({
        content: this.input.val(),
        order:   this.todos.nextOrder(),
        done:    false,
        user:    Parse.User.current(),
        ACL:     new Parse.ACL(Parse.User.current())
      });

更新 #2:Userオブジェクトに、ユーザーが所有するオブジェクトのACL読み取りのみを許可する設定がある場合、User別のユーザー オブジェクトを取得するためにクエリを実行することはできません。ただし、他に 2 つの問題が考えられます。

  1. s テーブルのフィールドに が必要なUser場合でも、オブジェクト全体ではなく、ユーザーの objectId を渡すことは可能ですか?userTodo_User
  2. 新しいユーザー オブジェクトを作成してそれに割り当てることもできると思います...これが問題になるシナリオを考えようとしていますが、今はできません。

誰かが役立つ解決策を確認または提供できる場合。#1を今すぐテストしようとしています。

更新 #3 -- いくつかのテストの後:

  1. s テーブルのuserフィールドがオブジェクトを必要とする場合、objectId を文字列として取りません。Todo_User
  2. ただし、新しいユーザー オブジェクトを作成し、そこに objectId を設定して、これを回避できます。

    var user = new Parse.User();      // Create user object
    user.id = "cqmEuj1Bzf";           // Assign user id
    
    // Create and save Todo
    var td = new Todo();              
    td.set("name", "Some ting todo");
    td.set("user", user);
    td.save();
    

まさに気になっていたのがこちら。user_id ( ) を知っている限り、別のユーザーのアカウントに Todo を正常に保存できましたobjectId。十分な数のユーザーがいると、少なくとも 1 人を推測して、誰かのアカウントを無作為に台無しにする可能性があります。

ならどうしよう?

回答: Cloud Code を使用して、渡されたユーザーが現在のユーザーと一致することを確認します。回答は、こちらの Parse のフォーラムに投稿されました。

4

1 に答える 1

1

クラウド コードを使用して、渡されたユーザーが現在のユーザーと一致することを確認できます。その回答は、こちらの Parse のフォーラムに投稿されました。

Cloud Code を使用して、objectId がこのリクエストを行っている現在のユーザーに対応していることを確認できます。実際、サンプル アプリケーションの Anypic は、"Photo" クラスと "Activity" クラスでこのチェックを行います。

Anypic の Cloud Code から:

Parse.Cloud.beforeSave('Activity', function(request, response) {   var currentUser = Parse.User.current();    var objectUser = request.object.get('fromUser');

  if(!currentUser || !objectUser) {
    response.error('An Activity should have a valid fromUser.');   } else if (currentUser.id === objectUser.id) {
    response.success();   } else {
    response.error('Cannot set fromUser on Activity to a user other than the current user.');   } });

Parse.Cloud.beforeSave('Photo', function(request, response) {   var currentUser = Parse.User.current();    var objectUser = request.object.get('user');

  if(!currentUser || !objectUser) {
    response.error('A Photo should have a valid user.');   } else if (currentUser.id === objectUser.id) {
    response.success();   } else {
    response.error('Cannot set user on Photo to a user other than the current user.');   } });
于 2012-12-31T06:15:23.567 に答える