MediaWikiで承認したユーザのみに閲覧・編集権限を付与する方法

# 要約
* **クローズド**なWikiをGCE上に構築したい
    * 最終目的は**Semantic MediaWki**の構築であるため、MediaWikiを使う
* `LocalSettings.php` 内の `$wgGroupPermissions` 配列を設定する
* 「利用者グループ」と「グループ権限/利用者権限」を設定することで可能
* 既存グループと各権限の依存関係が難しかったので記事にした
* 基本的には下記マニュアルの解説
    * https://www.mediawiki.org/wiki/Manual:User_rights/ja#

# やりたいこと
* [MediaWiki](https://www.mediawiki.org/wiki/MediaWiki)を用いて、限られたユーザだけが記事の閲覧/編集できるクローズドなWikiを構築したい
    * ユーザ登録申請は自由にできるようにしたい
    * 登録しただけでは、記事の閲覧/編集ができず、管理者から権限を付与できるようにしたい

# 環境
* Debian 9.13
* MediaWiki 1.34.2

# 利用者権限と利用者グループ
* 基本的に`LocalSettings.php`を編集することで、**利用者グループ**に各**権限**を設定していく
    * LocalSettings.phpについては[こちら](https://www.mediawiki.org/wiki/Manual:LocalSettings.php/ja)
    * 記入方法の例

```php:LocalSettings.php
$wgGroupPermissions['グループ名']['利用者権限'] = true /* または false */;
```


* いくつかの利用者グループはデフォルトで設定されている
    * それぞれのグループには規定の利用者権限が定められており、特に何も設定しなければ規定の利用者権限が適応される
    * 規定の利用者権限を上書きする形で`LocalSettings.php`を編集する

## よく使いそうなデフォルトグループ [^1]
|グループ名|概要|
|--------|---|
|*|すべての利用者（匿名利用者＝ユーザ未登録者を含む）|
|user|登録したすべてのユーザ|
|bot|bot権限を持つロボット(自動化スクリプト等)|
|autoconfirmed|少なくとも`$wgAutoConfirmAge`の期間は活動していて少なくとも`$wgAutoConfirmCount`回編集している登録済みアカウント[^2]|
|sysop|システム管理者|


## よく使いそうな利用者権限 [^3]
|利用者権限名|概要|
|--------|---|
|read|ページを閲覧|
|createaccount|新しい利用者アカウントを作成 - register / registration|
|createpage|ページ (議論ページ以外) を作成 - edit 権限が必要|
|createtalk|議論ページを作成 - edit 権限が必要|
|edit|ページを編集|
|move|ページを移動 - edit 権限が必要|

## "WhitelistRead"について
下記のような権限設定を行った場合、すべての利用者はメインページを含むすべてのページを見る権限を失う

```php:LocalSettings.php
$wgGroupPermissions['*']['read'] = false;
```

しかし、今回の目的では、初めての来訪者にはメインページとユーザ登録ページだけはアクセスできるようにしたいため、下記のように特定のページをホワイトリストに登録することで閲覧権限の例外を作成できる。

```php:LocalSettings.php
$wgWhitelistRead = array( 'メインページ', '特別:アカウント作成' );
```
※ *MediaWikiの言語設定が「日本語」であるため、ホワイトリスト設定時の名称も日本語で設定する必要がある点に注意*

# 必要な権限設定
上記、前知識を踏まえて、クローズドなWikiを構築するために必要な設定をする。大まかな流れとしては下記の通り。それぞれ解説していきます。
(解説の都合上、権限は'read'と'edit'のみ扱うが、必要に応じて他の権限も設定する)

1. すべてのユーザ(`'*'`)に対して「メインページ」「ユーザ登録ページ」以外の閲覧・編集を制限
2. `'user'`及び`"autoconfirmed"`に対しても同様に閲覧・編集を制限
3. `'sysop'`に対して閲覧・編集を許可
4. `'new-group'`に対しても閲覧・編集を許可
5. 新しく登録したユーザに対して、管理者アカウントから新しいユーザを"new-group"に設定

## 1. すべてのユーザに対して閲覧・編集を制限
```php:LocalSettings.php
$wgGroupPermissions['*']['read'] = false;
$wgGroupPermissions['*']['edit'] = false;
$wgWhitelistRead = array( 'メインページ', '特別:アカウント作成' );
```
[WhitelistReadについて](#"WhitelistRead"について)説明したとおり、初めてのユーザに登録画面までたどり着いてもらうためにメインページとアカウント作成画面の登録が必要

##2. `"user"`及び`"autoconfirmed"`に対しても同様に閲覧・編集を制限
```php:LocalSettings.php
$wgGroupPermissions['user']['read'] = false;
$wgGroupPermissions['user']['edit'] = false;

$wgGroupPermissions['autoconfirmed']['read'] = false;
$wgGroupPermissions['autoconfirmed']['edit'] = false;
```
個人的には、ここに非常に躓いた。下記理由でこの上書き設定が必要。

* 匿名ユーザがユーザ登録を完了した時点で、そのユーザは'user'グループや'autoconfirmed'グループ(設定している条件による)に追加される
* 'user', 'autoconfirmed'グループの規定権限では'read', 'edit'はそれぞれ付与されている
* そのため、ユーザ登録をした時点で（特に承認等ないまま）閲覧・編集可能になってしまう
* それを防ぐため上記設定が必要

## 3. `'sysop'`に対して閲覧・編集を許可
```php:LocalSettings.php
$wgGroupPermissions['sysop']['read'] = true;
$wgGroupPermissions['sysop']['edit'] = true;
```
上記説明と矛盾するのだが、２．を設定した時点で管理者アカウントでも閲覧・編集ができなくなってしまった。理由は詳しくわからないが、対処両方的に上記で動いたので良しとすることに。

## 4. `'new-group'`に対しても閲覧・編集を許可
```php:LocalSettings.php
$wgGroupPermissions['new-group']['read'] = true;
$wgGroupPermissions['new-group']['edit'] = true;
```
３．まででは、管理者グループしか閲覧・編集をできなくなってしまうため、管理者が承認した一般ユーザを集める新しいグループを設定する。

## 5. 新しく登録したユーザに対して、管理者アカウントから新しいユーザを"new-group"に設定
MediaWikiの「特別:利用者権限」ページから、該当ユーザに対して４．で設定した"new-group"を付与する（チェックボックスにチェックをつける）
![Screenshot 2020-08-16 at 16.50.55 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214822/ebe4bed8-bdea-04e9-62d5-4f83cfbe232f.png)

# やってみて
* 初めて触れるMediaWikiの仕様と悪戦苦闘しながらもなんとかできてよかった
    * とはいえ、まだまだ仕様をわかっていない部分も多い
    * むしろ何か間違っていたらコメントください
* 最終的には特定のコミュニティ内における[Semantic MediaWki](https://www.semantic-mediawiki.org/wiki/Semantic_MediaWiki)構築が目的であり、まだまだ道半ばなのでこれからも頑張る
* GCE上でのSemantic MediaWki構築についても今後まとめたい

[^1]: https://www.mediawiki.org/wiki/Manual:User_rights/ja#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E4%B8%80%E8%A6%A7 より抜粋・追記
[^2]: `$wgAutoConfirmAge`, `$wgAutoConfirmCount`もそれぞれ`LocalSettings.php`から設定可能
[^3]: https://www.mediawiki.org/wiki/Manual:User_rights/ja#%E6%A8%A9%E9%99%90%E3%81%AE%E4%B8%80%E8%A6%A7 より抜粋・追記