※旧「BASIC認証で任意のページごとに閲覧制限や編集制限をかける方法」。名前が長すぎなので修正しました。--Ynak
任意のページごとに閲覧制限や編集制限をかけたい。*1
具体的には
というようなことをやりたい。
PukiWiki/1.4/BasicAuthで紹介されている方法をそのまま使えば、全ページに対する編集権限を設定できる。
更に、コメント部で紹介された方法*2を使用すれば、正規表現で定義されたページ名に対する編集権限を1セット設定できる。
しかし、最終目標には少々足りていないので、更なる改造が必要。
pukiwiki.ini.phpで
ユーザID | パスワード |
正規表現によるページ名のパターン | 閲覧できるユーザID(カンマ区切り) |
正規表現によるページ名のパターン | 編集できるユーザID(カンマ区切り) |
を定義することで、ちょっとUNIXライクな読み書き*3権限の設定ができる。
PukiWiki1.3.4をベースに改造する方法は以下の通り。
以下を追加する。
$_msg_auth = 'PukiWikiAuth'; $_title_cannotread = '$1 は閲覧できません';
以下を追加する。
$_msg_auth = 'PukiWikiAuth'; $_title_cannotread = '$1 is not readable';
以下を追加する。
///////////////////////////////////////////////////////////////// // Basic認証による権限チェック function edit_auth() { global $get, $_title_cannotedit; global $edit_auth, $auth_users, $_msg_auth; global $vars, $edit_auth_pages; // 編集認証フラグをチェック (システム全体として編集認証するかどうか) if (!$edit_auth) { return; } // 認証が必要なページかどうかをチェック $edit_auth_users = ""; while (list($key, $val) = each($edit_auth_pages)) { if (preg_match($key, $vars['page'])) { $edit_auth_users = $val; break; } } if ($edit_auth_users == "") { return; } // // 認証を行う if ((!isset($_SERVER['PHP_AUTH_USER']) or !preg_match("/".$_SERVER['PHP_AUTH_USER']."/", $edit_auth_users) or !array_key_exists($_SERVER['PHP_AUTH_USER'], $auth_users) or $auth_users[$_SERVER['PHP_AUTH_USER']] != $_SERVER['PHP_AUTH_PW'])) { header('WWW-Authenticate: Basic realm="'.$_msg_auth.'"'); header('HTTP/1.0 401 Unauthorized'); // press cancel. $body = $title = str_replace('$1', htmlspecialchars(strip_bracket($get['page'])), $_title_cannotedit); $page = str_replace('$1',make_search($get['page']),$_title_cannotedit); catbody($title, $page, $body); exit; } } function read_auth() { global $get, $_title_cannotread; global $read_auth, $auth_users, $_msg_auth; global $vars, $read_auth_pages; // 閲覧認証フラグをチェック (システム全体として編集認証するかどうか) if (!$read_auth) { return; } // 認証が必要なページかどうかをチェック $read_auth_users = ""; while (list($key, $val) = each($read_auth_pages)) { if (preg_match($key, $vars['page'])) { $read_auth_users = $val; break; } } if ($read_auth_users == "") { return; } // 認証を行う if ((!isset($_SERVER['PHP_AUTH_USER']) or !preg_match("/".$_SERVER['PHP_AUTH_USER']."/", $read_auth_users) or !array_key_exists($_SERVER['PHP_AUTH_USER'], $auth_users) or $auth_users[$_SERVER['PHP_AUTH_USER']] != $_SERVER['PHP_AUTH_PW'])) { header('WWW-Authenticate: Basic realm="'.$_msg_auth.'"'); header('HTTP/1.0 401 Unauthorized'); // press cancel. $body = $title = str_replace('$1', htmlspecialchars(strip_bracket($get['page'])), $_title_cannotread); $page = str_replace('$1',make_search($get['page']),$_title_cannotread); catbody($title, $page, $body); exit; } }
編集制限が必要な追加・編集・プレビュー等の箇所に
edit_auth();
を、閲覧制限が必要な表示関係の箇所に
read_auth();
を挿入する。
// 追加 else if(arg_check("add")) { edit_auth(); // ★これを挿入!
// 編集 else if(arg_check("edit")) { edit_auth(); // ★これを挿入!
// プレビュー else if(arg_check("preview") || $post["preview"] || $post["template"]) { edit_auth(); // ★これを挿入!
// 書き込みもしくは追加もしくはコメントの挿入 else if($post["write"]) { edit_auth(); // ★これを挿入!
// 差分の表示 else if(arg_check("diff")) { read_auth(); // ★これを挿入!
// バックアップ else if($do_backup && arg_check("backup")) { read_auth(); // ★これを挿入!
// WikiName、BracketNameが示すページを表示 if(is_page($get["page"])) { read_auth(); // ★これを挿入!
else if(preg_match("/($InterWikiName)/",$get["page"],$match)) { read_auth(); // ★これを挿入!
if(preg_match("/^(($BracketName)|($WikiName))$/",$get["page"])) { edit_auth(); // ★これを挿入!
// 何も指定されない場合、トップページを表示 else { read_auth(); // ★これを挿入!
以下のように設定を追加する。
下記は設定例のため、設定内容は適切に変更すること。
////////////////////////////////////////////////// // 閲覧・編集制限の設定 // 認証のアカウント // ユーザ名とパスワードを記入。 $auth_users = array( 'foo' => 'foo_passwd', 'bar' => 'bar_passwd', 'hoge' => 'hoge_passwd', ); // 編集時に認証が必要か $edit_auth = 1; // 編集認証をかけるページ名のパターンを正規表現で設定する。 // マッチしたページに編集認証をかける。 // カンマ区切りで複数ユーザを書いても良い。 $edit_auth_pages = array( '/Barの公開日記/' => 'bar', '/ひきこもるほげ/' => 'hoge', '/(ネタバレ|ねたばれ)/' => 'foo', ); // 閲覧時に認証が必要か $read_auth = 1; // 閲覧認証をかけるページ名のパターンを正規表現で設定する。 // マッチしたページに編集認証をかける。 // カンマ区切りで複数ユーザを書いても良い。 $read_auth_pages = array( '/ひきこもるほげ/' => 'hoge', '/(ネタバレ|ねたばれ)/' => 'foo,bar,hoge', );
上の例では
かなり強引にUNIXっぽく表現すると、こうなる。
アクセス権 ユーザID グループ ページ名 -rw----r-- bar なし Barの公開日記 -rw------- hoge なし HogeOnly -rw-r----- foo hoges 映画紹介~ネタバレ注意
※グループhogesには、barとhogeが所属するとする。
$edit_auth_pages = array( '/Secret/' => 'hogefoobar', );