1つのシステムを複数の会社で安全に使う仕組み|Ulala Hub 開発ストーリー②

1つのシステムを複数の会社で安全に使う仕組み|Ulala Hub 開発ストーリー②

自社製グループウェア「Ulala Hub」の開発ストーリー、2回目です。社内用に作ったものを、複数の会社で使えるサービスに作り直すとき、最初に決めなければならなかったのが「会社ごとのデータをどう分けるか」でした。

分け方は3つある

方式 中身 良い点・困る点
会社ごとに別のサーバー 契約のたびに1台ずつ用意する 完全に分かれるが、費用と管理の手間が会社の数だけ増える
同じ表に「会社の番号」を付ける 全社のデータを1つの表に入れ、番号で絞り込む 作るのは簡単。ただし絞り込みを1か所でも書き忘れると、ほかの会社のデータが見える
データベースの中に会社ごとの区画を作る 1つのデータベースの中を、会社ごとの区画(スキーマ)に分ける プログラムは1つのまま、データは区画ごとに別。書き忘れで混ざることが構造上起きない

Ulala Hub は3つ目を選びました。データベースは PostgreSQL、アプリは Python の Django で、会社ごとの区画の切り替えには django-tenants という仕組みを使っています。

アドレスで会社を見分ける

契約した会社には、会社ごとの専用アドレス(サブドメイン)を用意します。利用者がそのアドレスを開くと、システムはアドレスから会社を判断し、その会社の区画だけを見る状態に切り替えてから処理を始めます。プログラムの側は「今どの会社か」を意識せずに書けます。

区画は2種類あります。

  • 共通の区画:運営用。会社の一覧、申込みの受付、契約の状態を持ちます。
  • 会社ごとの区画:その会社の社員、予定、掲示板、伝言、文書を持ちます。

ログイン情報も会社ごとに別にした

利用者のIDとパスワード、ログイン中の状態も、会社ごとの区画に入れています。A社のIDでB社のアドレスに入ることはできません。同じメールアドレスの人が2つの会社に所属していても、それぞれ別の利用者として扱われます。

アップロードされた文書ファイルも、会社ごとに別の置き場所に保存しています。

はまったところ

  • 共通の区画から、会社の機能を呼ぶと落ちる:予定や掲示板の表は会社ごとの区画にしかありません。運営用の画面から同じ部品を使おうとすると「表が無い」というエラーになります。共通の区画と会社の区画で、使う機能をはっきり分ける必要がありました。
  • 画面の行き先も2系統になる:運営用のアドレスと会社用のアドレスでは、使える画面の一覧が違います。片方にしか無い画面へ転送しようとして、行き先が見つからないことがありました。

会社が増えても作業が増えないようにする

申込みから利用開始までは、人の手を入れずに進みます。

  1. 会社名、希望するアドレス、管理者の名前とメールを入力する。
  2. 確認メールのリンクを開くと、その会社の区画が作られ、アドレスが登録され、管理者が作られ、お試しが始まる。
  3. 「準備ができました」のメールからパスワードを設定して、ログインする。

通信の暗号化に使う証明書は、すべてのサブドメインに使える種類(ワイルドカード証明書)を自動更新にしています。会社が1社増えるたびに証明書を取り直す、という作業はありません。

まとめ

「気をつけて絞り込む」ではなく「混ざらない構造にする」。作る手間は増えますが、サービスとして預かる以上、ここは最初に決めておいて良かった点です。次回は、月額課金の仕組みを書きます。

無料見積もり・
お問い合わせはお気軽に

フリーダイヤルでのお問合せはこちら

0120-828-121

メールでの無料見積もり
ご相談はこちら