見出し画像

cybozu.com共通管理者ではないkintoneユーザーがグループメンバーの管理をする

こんにちは、GO株式会社のSumiです。
社内のkintoneのお守りをしています。kintone界隈のみなさん仲良くしていただけると嬉しいです。

さて早速ですが、kintoneで使用するグループ(ロール)の機能はご存知でしょうか。アクセス権の設定において活用すると大変便利な機能ではあるものの、cybozu.com共通管理者と呼ばれる最上位の権限を持つユーザーしかグループメンバーを更新することができません

メンバーの管理のためだけにcybozu.com共通管理者の権限を現場のユーザーに渡すのは、契約情報やセキュリティ設定などが変更できてしまうため現実的ではなく
かといって、グループの更新があるごとに情シスへ申請して対応してもらうのは時間も手間もかかってしまうので、ユーザーの更新は現場のユーザーに任せたいところです。むむむ

ということで、今回はcybozu.com共通管理者の権限がないユーザーでもグループメンバーをkintone上で更新できるアプリを作成してみましたのでご紹介したいと思います。


仕組み

ざっくりですが、今回ご紹介するアプリの処理はこのようになっています。

現場の利用ユーザーに処理内容や認証情報などは隠したいので処理の実行環境にはGASを使用しています。

作り方

材料

材料はこちらの3つです。

  • kintone

  • Google Apps Script

  • cybozu.com共通管理者の権限を持つアカウント (ID・パスワードでログイン可能なもの)

アプリの作成

まずは外枠のアプリを作成していきます。フィールドコードは後ほど使用するのでメモしておいてください。

今回はシンプルに「グループ名」「グループコード」「ユーザー」の3つのフィールドで作成しています。必要であれば、グループ管理者のようなフィールドを用意しても良いかもしれません。

グループとグループコードは現場のユーザーに変更されると不都合なので、この2つのフィールドは管理者だけが編集権限を持つよう、アプリの設定よりフィールドの編集権限を制限してあげるのが良いかと思います。

kintone : JavaScriptでカスタマイズ

kintone側のJavaScriptでは、フィールドの値を取得しGASへ渡す処理を行います。

(function() {
    'use strict';

    // レコードの作成・編集画面で「保存」ボタンが押されたときのイベント
    kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function(event) {
        // レコードの情報を取得
        var record = event.record;

        // グループコードのフィールド「group_code」の値を取得
        var groupCode = record['group_code'].value;

        // ユーザーのフィールド「user」の値を取得
        var users = record['user'].value.map(function(user) {
            return user.code;
        });

        // Google Apps ScriptのURL
        var gasUrl = '{スクリプトのURL}';

        // 送信データの準備
        var payload = {
            groupCode: groupCode,
            users: users
        };

        // Google Apps ScriptへのPOSTリクエスト
        kintone.proxy(gasUrl, 'POST', {
            'Content-Type': 'application/json'
        }, JSON.stringify(payload), function(resp) {
            console.log(resp);
        }, function(error) {
            console.error(error);
        });

        return event;

        //return event; // イベントを正常に完了させるためにイベントオブジェクトを返します
    });
})();

Google Apps Script (GAS)

kintoneから渡されたグループコードとメンバーリストの値を使って、Cybozu APIからグループの更新を行います。

function doPost(e) {
    var params = JSON.parse(e.postData.contents);
    var groupCode = params.groupCode;
    var users = params.users;
    var auth = PropertiesService.getScriptProperties().getProperty("AUTH");

    var url = 'https://{テナント名}.cybozu.com/v1/group/users.json';
    var payload = {
        code: groupCode,
        users: users
    };
    
    var options = {
        'method' : 'put',
        'contentType': 'application/json',
        'headers': {
            'X-Cybozu-Authorization':auth
        },
        'payload' : JSON.stringify(payload)
    };
    
    var response = UrlFetchApp.fetch(url, options);
}

X-Cybozu-Authorizationの値はスクリプトプロパティで秘匿する形にしています。値については公式ドキュメントを参考にしてください。

コードが書けたら保存してデプロイ、アクセスできるユーザーを全員にしてウェブアプリとしてデプロイします。

よかったポイント

kintoneのレコードを編集すると必ず変更履歴が残ります。
誰がいつメンバーを変更したのかのログがわかりやすくなりました。

さらに、kintoneはアプリ単位・レコード単位・フィールド単位と細やかな権限設定ができるので、グループメンバーの管理は現場に任せるけどこの人にはこのグループは触られたくない!! という場合でも対応することができます。今回はざっくり設定していますが、今後の運用を見据えてレコードごとに編集可能なユーザーを設定してみようかなと思います。

改善ポイント

Cybozu APIの実行時に結果を変数に格納しているものの、その後のエラー時の処理書いてないんですよね。時間があればもう少し手を加えてちゃんとしたもの作っていきます。

まとめ

cybozu.com共通管理者の権限がないユーザーでもグループメンバーをkintone上で更新できるアプリを作成してみました。
実装自体はフィールドの値を取得してCybozu APIを利用してグループを更新するといっただけのシンプルなものなので割と簡単に実装することができました。

cybozu.com共通管理者はできることが多く強力な権限なだけに、むやみやたらに付与するとそれだけリスクも高まります。(cybozu.com共通管理者においてはユーザー管理だけ、のような管理者権限が実装されればいいのになと言ってみる) 

現場も管理者もハッピーになる運用ができればいいなと思って、今日もkintoneの運用やっていこうと思います。