識別、認証、認可
一般にシステムのアクセス制御は、識別(identification)、認証(authentication)、認可(authorization)という3つのステップを通じて行われます。 識別とは、システムの利用者に固有の識別名(ユーザー名)を割り当てること。認証は、システムのアクセスが特定のユーザー名の利用者によって行われていることを確認する処理。認可は、アクセス中のユーザーに割り当てられた権限に基づき、特定の操作ができるかどうかを確認することです。一般に Web アプリケーションでは、次のような形で利用者の識別、認証、認可を行います。
識別:ユーザー登録
利用者を識別する固有のユーザー名、パスワード、およびその他の属性情報(電子メールアドレス等)を指定してシステムのデータベースに登録します。
例:Drupal 8 のユーザー登録情報
認証:ログイン
利用者がユーザー名とパスワードを指定してログイン要求を送信すると、システムはデータベース上の登録情報と照合し、一致していればそのクライアント専用の Cookie を発行してログインを受け付けます。システムは以後、この Cookie に基づいてアクセス元および対応する登録ユーザーを識別します。ユーザーを識別できない(Cookie がない)リクエストは未ログインの匿名アクセスとして扱われます。
ユーザー名とパスワードによる認証のイメージ
認可:権限設定に基づくアクセスの許可/拒否
システム上で実行されるの操作の中には、特定の権限を必要とするものがあります。こうした操作を要求するリクエストが送信されると、システムはその送信元として識別した登録ユーザーに必要な権限が付与されているかどうかを確認し、操作を許可するか拒否するかを決定します。
ユーザー登録、ログイン認証、権限に基づくアクセス制限は、ほとんどの Web アプリケーションが必要とする共通の機能です。こうした機能が標準で用意されていることは、Drupal のような CMS をシステム基盤として採用する大きな理由になると思います。
Drupal 8 のアクセス制御
Drupal では、各ユーザーに直接権限を付与する代わりに、ユーザーを関連づける役割(ロール)を定義し、その役割に権限を付与することで間接的に権限を与える方法を採用しています。
役割に基づく権限付与
役割の管理
役割の管理画面には登録済みの役割が一覧表示され、ここから別の役割を追加することもできます。標準で匿名ユーザーと認証済みユーザーという2つの役割が用意されており、すべてのアクセスはこのいずれかに属するユーザーからのアクセスとして識別されます。次の画面では、管理者という役割が追加されています。
役割(ロール)の管理画面
こうして定義した役割は、ユーザーの属性の編集画面で設定することができます。登録ユーザーは強制的に認証済みユーザーとなり、さらに独自追加の役割を指定するオプションが表示されます。Drupal のユーザーは複数の役割を持つことができます。
ユーザーのプロパティ編集で役割を指定できる
権限の設定
権限の管理画面には、インストール済みのモジュールによって定義される権限の一覧を縦に、作成済みの役割を横にそれぞれマトリックス状に並べた一覧が表示されます。特定の権限と役割の交点に位置するチェックボックスをオン/オフにすることで、役割を付与する/しないを設定します。
権限の設定画面
こうして権限設定を行った役割を関連付けることで、システムが提供する権限のサブセットを間接的にユーザーに付与できます。与える権限の追加や削除が必要になった場合も、役割ごとに一括して更新することができます。
より詳しく具体的な例については、ThinkIT の連載記事をご覧ください。「ユーザー管理者」、「新着情報管理者」、「製品紹介管理者」という3つの役割に、異なるコンテンツタイプごとの権限や、ユーザー管理に必要な権限を割り当てる例を示しています。
- Drupal 8入門】モジュールのインストール、ユーザー作成と権限の設定
権限の定義
役割に付与する個々の権限は、対象機能を提供するモジュールによって定義されます。たとえば、タクソノミーに関する権限を見ると、次のような項目があります。
これらは、タクソノミーの機能を提供する taxonomy というコアモジュールによって定義されたものです。より具体的には、モジュールのソースに含まれる <モジュール名>.permission.yml という YAML ファイルで定義されます。taxonomy モジュールの場合は、taxonomy.permission.yml というファイルになります。
administer taxonomy:
title: 'Administer vocabularies and terms'
permission_callbacks:
- Drupal\taxonomy\TaxonomyPermissions::permissions
前半の2行は、サイトの構成に関係なく固定的に定義できる権限で「静的な権限」と呼ばれています。先に示した画面にある「ボキャブラリーとタームの管理」という権限は、ここで定義されたものです。
後半の2行は、PHP のコードで動的に権限を定義するためのもので、登録する権限の情報を格納した配列を返却するコールバックメソッドを指定しています。このメソッドのコードは次のようになっています。
public function permissions() {
$permissions = [];
foreach ($this->entityManager->getStorage('taxonomy_vocabulary')->loadMultiple() as $vocabulary) {
$permissions += [
'edit terms in ' . $vocabulary->id() => [
'title' => $this->t('Edit terms in %vocabulary', ['%vocabulary' => $vocabulary->label()]),
],
];
$permissions += [
'delete terms in ' . $vocabulary->id() => [
'title' => $this->t('Delete terms from %vocabulary', ['%vocabulary' => $vocabulary->label()]),
],
];
}
return $permissions;
}
このコードでは、タクソノミーで定義したボキャブラリーごとに、編集と削除に必要な権限の説明とラベルを格納した配列を作って返却しています。このようにプログラムコードを利用して実行時に登録される権限は「動的な権限」と呼ばれ、状況に応じて権限を構成することができます。この例では、作成済みの Tag と車種という2つのボキャブラリの編集と削除に必要な計4つの権限が追加されています。動的な権限を利用することで、新しいボキャブラリーが追加された場合でも、その編集と削除に必要な権限を自動的に用意することができます。
アクセス制御に関する拡張モジュールの利用
コンテンツ管理に関わるアクセス制御としては、編集機能だけでなく表示を制限したい場合もあります。たとえば、特定のコンテンツタイプのノードはログインしないと見えないようにしたいといったニーズはよくあると思いますが、残念ながらコアの標準機能だけでは構成できません。このような場合はコア以外のモジュールを利用することになります。アクセス制御に関するモジュール(contributed module)もいくつか紹介しておきましょう。
Content Access モジュール
https://www.drupal.org/project/content_access
コンテンツタイプごとに、自分の作成したノードの表示、編集、削除、および自分以外が作成したノードの表示、編集、削除の各操作を、役割別に許可/不許可を設定できるようにします。さらに、コンテンツタイプだけでなく、ノード単位で同じ制限を設定することも可能です。
Content Access モジュールの設定画面
このモジュールを利用すると、特定のコンテンツタイプのノードを、特定の役割のユーザーだけに表示、編集、削除できるように構成できます。たとえば、ログイン中のユーザー(認証済みユーザー)だけがコンテンツを閲覧できるサイトを作る場合などに利用できます。
ACL モジュール
https://www.drupal.org/project/acl
Drupal コアのアクセス制御は役割ベースで行う仕様なので、個々のユーザー単位で権限を設定することはできません。これを可能にする API を提供するのが ACL モジュールです。ACL モジュール自体は API を提供するだけで、管理上の機能を追加するものではありませんが、この API を利用する別のモジュールと組み合わせることでユーザー単位のアクセス制御が可能になります。たとえば、上の Content Access と組み合わせると、ノードの表示、更新、削除の権限を個々のユーザー単位で指定できるようになります。
ACL をインストールすると Content Access の権限設定がユーザー単位で行える
Override Node Options モジュール
https://www.drupal.org/project/override_node_options
Drupal のノードの編集画面には掲載/非掲載のオプションがあり、非掲載を指定すると、投稿者以外は見ることのできない下書きとして保存されます。また、投稿日時、投稿者といった共通のオプションや属性もあります。こうした属性の編集は、標準ではノードの投稿者にのみ許されています。こうした操作を、コアだけの標準構成で投稿者以外のユーザー許可するには「コンテンツの管理」という全コンテンツタイプの編集を可能にする権限を与える必要があります。セキュリティ上これは認められない場合もあるでしょう。
Override Node Options モジュールを利用すると、コンテンツタイプごとに、特定の共通属性の編集許可を与えることができます。たとえば、自動車コンテンツタイプについてのみ、投稿日時と掲載/非掲載の設定を特定の役割を持つユーザーに許可する構成が可能です。
Override Node Options の権限設定
view_unpublished モジュール
https://www.drupal.org/project/view_unpublished
非掲載で保存したノードの閲覧は、標準では投稿者本人に限定されます。このモジュールを利用すると、コンテンツタイプごとに、投稿者以外が作成したノードも閲覧できる役割を指定できます。下書きのコンテンツを複数のユーザー間でレビューしたい場合などに便利です。
他のCMSでの扱いと比較
最後に、これまでも見てきた WordPress や MT でアクセス制御がどのように扱われているのかを見ておきましょう。
WordPressとの比較
Drupal 同様、WordPress にも「権限グループ」というロールがあり、標準で6つ(管理者、編集者、投稿者、寄稿者、購読者、スタッフ)の権限グループが定義されています。この権限グループをユーザーに関連づけることで、一括してユーザーに権限を付与できるようになっています。ただし、WordPress の権限グループは1ユーザーに1つのみで、Drupal のように複数指定することはできません。
WordPress 本体には、Drupal のようなロールの追加や編集、またロールに個々の権限を割り当てる UI は用意されておらず、標準構成では初期設定をそのまま使用する形になります。ただし、内部的には権限グループや権限を設定する仕組みは持っており、権限を追加する API も用意されているので、これらを利用して、権限グループの追加・編集・削除や、独自の権限の追加などの UI を提供するプラグインを作ることができます。こうしたプラグインは数多く存在し、たとえば次のようなものがあります。
- User Role Editor
- Capability Manager Enhanced
- Members
- Advanced Access Manager
たとえば、Advanced Access Manager をインストールすると、次のような専用の管理画面が提供され、権限グループや追加や編集、権限の新規作成などが行えるようになります。
Advanced Access Manager の管理画面
こうしたプラグインを活用すれば、Drupal コアと同じようにアクセス制御に必要な設定を編集することができます。ただし、対応できる範囲(例:カスタム投稿タイプに対応しているかどうか等)や品質、サポート状況などはプラグインによってまちまちである点には注意が必要です。
MT6との比較
MT にもロールがあり、Drupal や WordPress と同様、このロールを通じてユーザーに権限を付与する仕組みになっています。ウェブサイト管理者、ウェブマスター、コメント投稿者など、標準で9つのロールが定義されており、必要に応じて独自のロールの追加することや、既存のロールを編集することもできます。
MT6 のロールの管理画面
ロールの編集では、システムが定義する各権限の中から、そのロールに付与するもののチェックボックスをオンにします。MT6 では WordPress のようにカスタム投稿タイプを定義することはできないので、投稿に関する権限はブログ記事やウェブページを前提とした標準の権限のみです。MT は再構築で生成した静的ページを公開するタイプの CMS なので、アクセス制御の対象は基本的にコンテンツを管理者する側のユーザーに限定され、ロールや権限の構成は、WordPress や Drupal に比べるとシンプルです。
まとめ
今回見てきたユーザー登録、ログイン認証、アクセス制限は、Web アプリケーションで共通して必要とされる機能です。こうした機能は、個別に実装するよりも、フレームワークが提供する共通の実装を利用する方が効率的で確実です。Drupal では、認証や認可の仕組みをコアの API と UI の両方でサポートし、タクソノミーやコンテンツタイプ等、他の機能要素とも動的に連携した形で権限を設定できるようになっています。ここでも、システム横断的に基本機能を提供するという、Drupal のフレームワーク的な側面がうかがえると思います。 これまで、コンテンツタイプ、タクソノミー、ブロック、クエリー、多言語化、権限設定と、コアの重要機能を見てきました。連載の終盤として、残り2回でテーマとモジュールの利用について取り上げたいと思います。
関連コンテンツ
- アクイア vs サイトコア:オープンであることがもたらす根本的な違い
- 第 13 回 Drupal の権限設定と WordPress や Movable Type との比較
- 第 11 回 Drupal と他の CMS のクエリビルダー機能を比較
- 第 8 回 コンテンツ管理における Drupal と他の CMS との比較
- Contenta CMSによるDecoupled Drupalサイトの構築
- Drupalが最も安全なCMSである理由
- Drupal vs WordPress SEOとパフォーマンスの観点から比較
- 第11回 Drupal 8 と他のCMSのクエリビルダー機能を比較
- 第8回 コンテンツ管理におけるDrupal 8 と他のCMSとの比較
- 第2回 Drupal 8 はフレームワークか?CMSか?他のCMSとの比較
Drupal 8初心者講座バックナンバー
- Drupal 8初心者講座について
- 第1回 歴史に見るDrupalのDNA
- 第2回 Drupalはフレームワークか?CMSか?他のCMSとの比較
- 第3回 Drupalの特徴
- 第4回 Drupal 8のインストール (1)
- 第5回 Drupal 8のインストール(2)
- 第6回 Drupalにコンテンツを投稿してみる
- 第7回 Drupalのボキャブラリとタクソノミーの使い方
- 第8回 コンテンツ管理におけるDrupalと他のCMSとの比較
- 第9回 Drupal 8のブロックシステム
- 第10回 Drupalの標準クエリービルダ Viewsの使い方
- 第11回 Drupalと他のCMSのクエリビルダー機能を比較
- 第12回 Drupal 8の多言語機能と他のCMSやサービスとの比較
- 第13回 Drupalの権限設定とWordPressやMovable Typeとの比較
- 第14回 Drupalのテーマシステムについて
- 第15回 Drupalの拡張モジュールの選定と使い方
- 第16回 Drupalをもっと知りたい方に向けた各種情報