管理者権限として、全レコードを取得する件について

:arrow_forward:︎やりたいこと

java scriptを使って全てのレコードを取得したい

※レコードの閲覧権限がない場合でも

 

:arrow_forward:︎現状

担当者は、担当者自身のレコードしか見れないように閲覧権限を設定しています。管理者は全てのレコードの閲覧権限があります。

自分が作成したコードでは、自分が閲覧できるレコードしか取得できていません。

※現状のコード

shigeyoshi tsujiuchi さん

「レコードの閲覧権限がないユーザーの画面に、本来閲覧できないはずの情報を表示する」というのは、かなりイレギュラーですね。

月並みですが、やはり、「閲覧権限を与える」が一番妥当な方法かと思います。

少しめんどくさいですが、該当アプリの見せても良いフィールドだけを、ユーザーに閲覧権限を与えて、それ以外は隠す。等の工夫をすれば、要件を満たせそうな気もします。

 

後、おそらく推奨はされませんし、実際にできるかもわかりませんが、なんとなくできるかも知れないなと思うのは、APIトークンを使った接続でしょうか。

JavaScriptのソースにAPIトークンを書いていいのか等、セキュリティ的に色々と微妙なのと、仮に書いたとして、本当に出来るかどうかわかりませんが、唯一望みがあるとすれば、APIトークンだと思います。

こちらのスレッドが、近しい内容に見受けられます。

カスタムJavascriptでの別ユーザーでの保存について

https://developer.cybozu.io/hc/ja/community/posts/201142040-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0Javascript%E3%81%A7%E3%81%AE%E5%88%A5%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A7%E3%81%AE%E4%BF%9D%E5%AD%98%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6 

上海レンユアー 松村 さん

回答いただき、ありがとうございます。

上記、APIトークンの件で一度試してみます。

 

今回、実現したいことは、”名前の重複検知”です。

他のユーザーのレコード閲覧権限がない場合、重複の検知ができないです。

重複検知に関して、別のアプローチ方法ありましたら共有いただけますと幸いです。

 

よろしくお願いします。

shigeyoshi tsujiuchi さん

なるほど、名前の重複検知ですか。

*名前というフィールドがある。

*全レコードで、このフィールドの値はユニークである必要がある(重複を認めない)

この要件であれば、名前フィールドの「重複を許可しない」にチェックを入れてあげれば、標準機能で、保存時にチェックがかかるので、対応できるかなと思います。

(試したことないのですが、一部レコードにしか権限がない場合でも、「重複を許可しない」のチェック対象は全レコードなのかなと勝手に思っています。

 

もっと細かい要件だったり、入力中に重複検知をしたい。等の要件がある場合は、APIトークンを使うくらいしか、対応方法が思いつきません。

shigeyoshi tsujiuchi 様

 

やってできないことはありません。

管理者権限、あるいは全件を表示できるアカウントを用意して、以下のコードの

    auth= ******************

の*******************の部分には 「ログイン名:パスワード」をBASE64エンコードしたものを入れてください。

 

ただし、アカウント情報をハードコーディングすることになりますから、あまりおすすめしません。

やるとしても、「何でもあり」の管理者権限を使わずに、重複チェックに必要な、最低限の閲覧権限だけを持たせたアカウント用意してやるべきだと思います。

 

// ***********************************************************************************************************
// Administrator権限で全レコードをGETする
// ***********************************************************************************************************
function getAllRecordsAsAdmin(appId, query, opt_offset, opt_limit, opt_records){
// 変数設定
var offset;
var limit;
var records;

var auth= ************************* ;

// offset
if (opt_offset == undefined) {
offset = 0;
} else {
offset = opt_offset;
}

// limit
if (opt_limit == undefined) {
limit = 500;
} else {
limit = opt_limit;
}

// records
if (opt_records == undefined) {
records = [];
} else {
records = opt_records;
}

var url = kintone.api.url('/k/v1/records', true);
var headers = {
"X-Cybozu-Authorization": auth,
"Authorization": "Basic " + auth
};

// GETパラメータの設定
var params = '?app=' + ppId + '&query=' + encodeURI(query + ' limit '+ limit + ' offset ' + offset);
// proxyリクエスト送信
return kintone.proxy(url + params, 'GET', headers, {})
.then(function (args) {
var resp = JSON.parse(args[0]);

records = records.concat(resp.records);
if (resp.records.length === limit) {
return getAllRecordsAsAdmin(appId, query, offset + limit, limit, records);
}
return records;
})
.catch(function(error){
debugConsole(error);
return error;
});
}