今日はwebform_nodeとgroupの話。
DrupalのWebformモジュールはGoogle Formsを遥かに超えるサイトビルダー経験を与えてくれるものだ。一方で、セキュリティ確保は難しい。匿名で投稿されたデータも守りたいし、認証ユーザーが投稿したデータを他のユーザーの目から守りたい。一方で、その投稿データに基づいて仕事をする人からは必要な情報が見られるように設定しないといけないから、考慮点は多いのである。
Webformは送信結果の閲覧変更権限が設定できるように作られている。
デフォルトでは、view any submissionsはオフだ(実際には管理者はアクセス権を超越するので読み書き自由)。そのフォームを扱う人から読めないと不都合なので、管理者以外の役割(Role)を設定して読み込み可とする。これは、これでOKなのだが、その権限を付与してしまうと、そのWebformで投稿された結果(submission)をすべて見られるようになってしまう。submissionは単なるデータでアイデンティティに基づく保護がない。
そもそもフォームは、匿名ユーザーがデータを入力できるところがありがたい。簡単なところでは、コンタクトフォームでサービスリクエストを受け付けるというケースをすぐに思いつく。しかし、一方で購入や決済の情報入力では、追跡可能性を放棄するわけにはいかない。ほとんど、似たようなフォームでも、入力者のアイデンティティが関わるか否かで激しく変わるのである。
例えば、他人に知られたくないような買い物をweb経由でしたいシーンを想定すれば良い。商品を案内しているサイトには自分のことを知られたくないから、ユーザー登録などしない。しかし、商品を見つけて購入したいと思った瞬間に金の受け渡しで個人がバレる危機に直面する。単純な解はクレジットカードだ。クレジットカードブランドを指定して、決済のプロセスに入れば良い。売り手と買い手は、何を取引するかを知っている。売り手は買い手が誰かは知らないが、買い手の代わりにクレジットカード会社が支払いを保証してくれて取りっぱぐれないならどうでも良い。クレジットカードは買い手が売り手から何を買ったのかは知る必要がない(知りたくない)。細かい話をすれば、もっと複雑なのだが、第三者を介することで、売り手に対して買い手は匿名性を確保できる。
フォームの問題を再考すると、買い手と売り手は匿名。買い手とクレジットカード会社はお互いを知っている。売り手とクレジットカード会社はお互いを知っている。つまり、フォームで考えると3つあって、売り手買い手間フォーム、売り手カード間フォーム、買い手カード間フォームがある。そして、カード会社との間のフォームの相互アイデンティティ確立は極めて重要になる。
DrupalのWebformはsubmissionはデータだから、ここに買い手や売り手の情報が入ってしまうと機密性を守れない。だから、売り手買い手間のフォームの中にカード会社の取引IDだけがあるのが望ましい。取引IDに結びついた売り手の情報、買い手の情報は厳格に守られる必要がある。Webform nodeはDrupalのコンテンツなので、Groupモジュールを利用すれば、かなり柔軟な制御が可能となる。同じコンテンツタイプでもコンテンツをグループ化して見られるコンテンツを所属属性ごとに限定することができる。
取引については、コンテンツとして厳格に管理し、そのコンテンツとWebformを結びつければ不用意な情報漏えいを防止することが可能になる。取引データ(submission)から取引者の属性(Webform nodeのフィールド - entity reference)を分離することが可能になる。取引の匿名性を確保しようと思うと、そのWebform nodeに結びついたsubmissionは一件となる。
冒頭の画像は、webformでその設定を行っている画面である。「Limit total to one submission per webform/source entity」がWebform nodeに結びついたsubmissionを一件限りにするという設定だ。ただ、ここにあるメッセージは深刻である。
Please make sure users are allowed to 'view any submission' and 'edit any submission'.
ちょっと考えると、webform nodeから既存submissionを探すので、view any submissionの権限がないと、submissionにたどり着けない。
つまり、当該Webformを扱える人はアクセス権的には全部見えるようになるということだ。単純に取引金額が入っているとすると、何件、総額いくらの取引があったかを見られることになる。ただ、対応するwebform nodeにアクセス権がなければ何の取引かも誰が関わる取引かも分からない。最後のガードは担保されることになる。Groupモジュールを利用して、アクセス可能なwebform nodeを限定すれば良い。
サイトを構築すると仕組みがわかってくるが、複数の権限モデルの組み合わせが必要だと猛烈に難しくなる。ワークフローや多言語対応でも同じような困難に直面する。
Webformを使う場合、検討時はsubmissionの秘匿性は無いものとして設計するのが基本だ。機能的には、フォームの項目ごとにかなり細かい設定ができる。便利に使えるシーンは多いが、個々の検討に入る前に、まずsubmissionに入れるものを最小化するのが肝要となる。
webformの重鎮が、この件に関わる議論をブログ(The Webform module now provides Group integration for submission management)に書いている。彼の観点は技術から見た絵だが、ビジネスの世界もかなり見通している。