OXY NOTES

PukiWikiで特定のページに閲覧制限をかける方法

PukiWikiには「:config」という設定用のページが存在します。
このページは各種プラグインなどの設定を行うページで、ほとんどの利用者にとっては見る必要のないページです。

特に設定ファイルなのでbotなどに変更されると修正が面倒です。
ほとんどの場合、configページを編集するのは管理者のみではないでしょうか。

であるならば、自分だけ閲覧・編集できれば良いわけです。
そこでconfigページに閲覧制限をかけようという趣旨です。


configページに閲覧制限をかける方法

まずは閲覧制限を有効にします。
PukiWikiのルートディレクトリにある「pukiwiki.ini.php」を編集します。

/////////////////////////////////////////////////
// Read auth (0:Disable, 1:Enable)
$read_auth = 0;

以下のように1に変更。

/////////////////////////////////////////////////
// Read auth (0:Disable, 1:Enable)
$read_auth = 1;

続いて閲覧制限をかけたいページ名を指定します。

$read_auth_pages = array(
	// Regex		   Username
	// '#HogeHoge#'		=> 'hoge',
	// '#(NETABARE|NetaBare)#'	=> 'foo,bar,hoge',
);

いくつかサンプルがありますが、今回は正規表現で行います。

$read_auth_pages = array(
	'/config/'		=> 'hoge',
);

これでページ名に「config」という名前の付くページの閲覧は「hoge」というユーザーにだけ許可されます。

続いて編集者制限も追加します。
これをしておかないと「URLさえわかればページは見られないのに編集はできるという状態になります。」と、公式の解説ページにはありましたが、現在では閲覧宣言がかかったページは自動で編集制限のかかるようです。(editプラグインだけ?)
見えないページを編集できる仕様はどう考えてもおかしいので、一応設定しておきましょう。

上記と同じ用に$edit_authを有効にしてconfigページの編集権限をhogeユーザーへ与えます。

/////////////////////////////////////////////////
// Edit auth (0:Disable, 1:Enable)
$edit_auth = 1;

$edit_auth_pages = array(
	'/config/'		=> 'hoge',
);

最後に「hogeというユーザーを追加」して、ログイン用のパスワードを設定します。
ユーザー名とパスワードはご自身の環境に合わせて適宜読み替えてください。(この解説のまま入力しないでください。)

/////////////////////////////////////////////////
// User definition
$auth_users = array(
	// Username => password
);

この配列にユーザーネームとパスワードを追加することができます。
セキュリティの関係上、パスワードは平文で保存するのは推奨されません。PukiWikiでは以下のフォーマットで暗号化することが可能です。
パスワードにある{MD5}{x-php-sha1}が暗号形式の指定方法です。

 // SELECT ONE
 //$adminpass = 'pass';            // Cleartext
 //$adminpass = '{CLEARTEXT}pass'; // Cleartext
 //$adminpass = '{SSHA}B78f8i/RpNC+CyFdKLH2odaK8hlPNjlOOUUyMA=='; // SSHA 'pass'
 //$adminpass = '{SHA}nU4eI71bcnBGqeO0t9tXvY1u5oQ=';              // SHA 'pass'
 //$adminpass = '{SMD5}o7lTdtHFJDqxFOVX09C8QnlmYmZnd2Qx';         // SMD5 'pass'
 //$adminpass = '{MD5}Gh3JHJBzJcaScd3wyUS8cg==';                  // MD5 'pass'
 //$adminpass = '{CRYPT}$1$nxrVut5a$c9LdXN1rKQC1HQOwBY4O//';      // CRYPT 'pass'
 //$adminpass = '{x-php-sha1}9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684'; // sha1('pass')
 //$adminpass = '{x-php-md5}1a1dc91c907325c69271ddf0c944bc72';          // md5('pass')
 //$adminpass = '{x-php-crypt}$1$nxrVut5a$c9LdXN1rKQC1HQOwBY4O//';      // crypt('pass')

この中では「sha1」が一番セキュリティが高いので利用します。本来はsaltなんかも設定するといいのですが、そのへんはPukiWikiが内部で頑張ってるみたいなのでおまかせします。

パスワードの生成は以下のように打てば出力されます。

var_dump( sha1('pass') ); // 9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684

何やらPukiWikiで専用の関数も用意されているようです。第1引数にパスワードの文字列、第2がアルゴリズムを指定します。

pkwk_hash_compute('pass', '{x-php-sha1}')

このコードに{x-php-sha1}を付けて以下のようにします。
サンプルで用意されているユーザー名とパスワードはセキュリティの驚異に繋がるので削除してください。

$auth_users = array(
	hoge => '{x-php-sha1}9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684'
);

以上で準備は完了です。

これで「config」という名前のつくページにアクセスすると認証が画面が出るようになります。
一応上記の設定で閲覧制限はかけられたのですが、私の環境では対応する言語ファイルの設定がないため、本来表示されるはずの「ユーザー名」や「パスワード」という文字列がありません

そこで言語ファイルも編集します。

ルートディレクトリにある「ja.lng.php」に追記します。

$_loginform_messages['username'] = 'ユーザーネーム';
$_loginform_messages['password'] = 'パスワード';
$_loginform_messages['login'] = 'ログイン';

以上で設定は完了です。
この設定を行い「config」ページにアクセスすると、以下のようなログインが画面が表示されます。

設定したユーザー名をパスワードを入力して初めて閲覧・編集できるようになります。