LoginSignup
7
8

More than 5 years have passed since last update.

【NCMB】Nifty Cloud Mobile Backendのパーミッションの基本

Posted at

今まであまり注意してみていなかったNCMBのパーミッション

permission.png

「読込」って何だよ?(´・ω・`)

となってので、いろいろ試してみました。
ちなみに権限が無いと403エラーが返ってきます。

一応、公式ドキュメントはこちら
データストア(JavaScript):アクセス権限設定

読込

findById()に制限を与えます。
読込と検索の違いですが、「読込はObjectId指定でのレコードの読込」のことです。
エンドユーザーに特定のデータ以外を見せたくない場合は制限をかけましょう。

findByIdとか普段使わないから、存在すら知りませんでした。

以下、サンプル。

var read_test = (function(){
    var Test = ncmb.DataStore("Test");
    Test.fetchById("hogeHogeFugaFUga")
    .then(function(res){
        alert(JSON.stringify(res));
    })
    .catch(function(e){
        alert(e);
    });
});

これ以降は公式ドキュメントにも記載がある内容です。

検索

読込でも触れましたが、こちらはfetch()またはfetchAll()に制限を与えます。
エンドユーザーにデータを一切見せたくない場合は制限をかけましょう。

var find_test = (function(val){
    var Test = ncmb.DataStore("Test");
    Test
    .fetchAll() // or fetch()
    .then(function(results){
        if (results.length == 0)return;
        alert(JSON.stringify(results));
    })
    .catch(function(e){
        alert(e);
    });
});

更新

update()に制限を与えます。
私の認識では、既存の行Objectを取得しておく必要があるので、
利用の際は、少なくとも「読込」または「検索」のどちらかに権限が必要です。
エンドユーザーにデータを更新させたくない場合は制限をかけましょう。

var update_test = (function(val, new_val){
    var Test = ncmb.DataStore("Test");
    Test.equalTo("value", val)
    .fetchAll()
    .then(function(results){
        if (results.length == 0)return;
        var obj = results[0];
        obj.set("value", new_val);
        obj.update();
    })
    .catch(function(e){
        alert(e);
    });
});

作成

create()またはbatch()に制限を与えます。
エンドユーザーにデータを作成させたくない場合は制限をかけましょう。

var create_test = (function(val){
    var Test = ncmb.DataStore("Test");
    var test = new Test();
    test.set("value", val).save().then(function(results) {
        alert(JSON.stringify(results));
    }).catch(function(err) {
        alert(err);
    }); 
});

削除

delete()に制限を与えます。
「更新」と同様に私の認識では、既存の行Objectを取得しておく必要があるので、
利用の際は、少なくとも「読込」または「検索」のどちらかに権限が必要です。
エンドユーザーにデータを削除させたくない場合は制限をかけましょう。

var delete_test = (function(val){
    var Test = ncmb.DataStore("Test");
    Test.equalTo("value", val)
    .limit(1)
    .fetchAll()
    .then(function(results){
        if (results.length == 0)return;
        var obj = results[0];
        obj.delete();
    })
    .catch(function(e){
        alert(e);
    });
});

フィールド追加

set()に制限を与えます。
フィールド追加のため、利用の際は、少なくとも「作成」または「更新」のどちらかに権限が必要です。
エンドユーザーにカラムを追加させたくない場合は制限をかけましょう。

var add_col_test = (function(val){
    var Test = ncmb.DataStore("Test");
    var test = new Test();
    test
    .set("value", val)
    .set("add", "add") //←ここで増えてます。
    .save().then(function(results) {
        alert(JSON.stringify(results));
    }).catch(function(err) {
        alert(err);
    }); 
});

まとめ

javascriptからNCMBを使うのはとても簡単です。

簡単なサービスなら無料ホスティングサービスと組み合わせることで、コストを掛けずサービスのリリースが可能です。

個人的には神バックエンドだと思ってます。

その反面、権限周りを正確に設定しておかないと悪意のあるユーザーに大切なデータを破壊される危険性があります。(可能性は低いですが…)

というのもChromeやsafariの開発者向けコンソールから任意のコードが実行できるからです。
権限をすべて与えていると、記述したjavascriptに関係なく、意図しないコードを実行されるリスクが出てきます。

そのため権限設計は丁寧に行いましょう。

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8