任意のページに対する閲覧・編集・検索でアクセス制御を行う。
アクセス制御対象となるページは、以下のいずれかで決定できる。
(具体例)
pukiwiki.ini.phpに以下の項目を設定することで、 既存・新規作成ページに対するアクセス制御を行うことができる。
アクセス制御で使用するユーザとパスワードを設定する。
// ユーザ定義 $auth_users = array( 'foo' => 'foo_passwd', 'bar' => 'bar_passwd', 'hoge' => 'hoge_passwd', );
1.4.6 以降のパスワード保存書式については、BugTrack/709 を参照
××認証対象パターン定義で定義したパターンがどこにあったら、 マッチしたことにするのか、を設定する。
※今回からページ内容によるアクセス制御に対応した。
// 認証方式種別 // pagename : ページ名 // contents : ページ内容 $auth_method_type = "contents";
閲覧認証によるアクセス制御を行うかどうか設定する。 不要な場合はオフにすればパターンマッチングを行わないので、性能劣化を防止できる。
// 閲覧認証フラグ // 0:不要 // 1:必要 $read_auth = 1;
閲覧認証をかけるページを決定するための正規表現パターンを設定する。 マッチしたページに閲覧認証をかける。 カンマ区切りで複数ユーザを書いても良い。
// 閲覧認証対象パターン定義 $read_auth_pages = array( '/ひきこもるほげ/' => 'hoge', '/(ネタバレ|ねたばれ)/' => 'foo,bar,hoge', );
編集認証によるアクセス制御を行うかどうか設定する。 不要な場合はオフにすればパターンマッチングを行わないので、性能劣化を防止できる。
// 編集認証フラグ // 0:不要 // 1:必要 $edit_auth = 1;
編集認証をかけるページを決定するための正規表現パターンを設定する。 マッチしたページに編集認証をかける。 カンマ区切りで複数ユーザを書いても良い。
// 編集認証対象パターン定義 $edit_auth_pages = array( '/Barの公開日記/' => 'bar', '/ひきこもるほげ/' => 'hoge', '/(ネタバレ|ねたばれ)/' => 'foo', );
検索時にも閲覧認証と同等のアクセス制御が必要かどうか設定する。 どちらの場合も、ページ名は公開情報なので検索対象となる。
// 検索認証フラグ // 0: 閲覧が許可されていないページ内容も検索対象とする // 1: 検索時のログインユーザに許可されたページのみ検索対象とする $search_auth = 0;
上の例では
かなり強引にUNIXっぽく表現すると、こうなる。
アクセス権 ユーザID グループ ページ名 -rw----r-- bar なし Barの公開日記 -rw------- hoge なし HogeOnly -rw-r----- foo hoges 映画紹介~ネタバレ注意
※グループhogesには、barとhogeが所属するとする。
PukiWiki1.4rc2(20030529版)をベースにする場合は、以下を改造する。 *1
設定ファイルの仕様で紹介した項目を追加して、適切な設定を行う。 すでに存在している$edit_auth, $edit_auth_usersの設定は削除するか、 コメントアウトすること。
アクセス制御する仕組みは用意したが、 実際にページにアクセスするのはすべてプラグインである。
よって、プラグインで以下の関数による事前チェックを行うように改造する必要がある。
引数 | 説明 |
$page | ページ名文字列 |
$auth_flag | true: 現在のログイン状態で認証NGであれば、BASIC認証発動(デフォルト) |
false:現在のログイン状態で判断するだけ | |
$exit_flag | true: 認証NGの場合、check_xxxable関数側でNG画面に遷移する(デフォルト) |
false:認証NGの場合でも、戻り値falseで戻ってくるだけ |
戻り値 | true: 認証OK |
false:認証NG |
この改造に伴って一緒に改造する必要があるプラグインの一覧を以下に示す。 Ynakの環境で単にgrep -lE '(get_source|file)' pukiwiki/plugin/*.phpした結果+read.inc.phpなので漏れがあるかもしれない。
このうち少なくともedit, read, edit, backup, diffは絶対に改造する必要がある。
※改造したものからリンク先に改造方法を書く、ということでよろしければご協力お願いします。
Ynakのところで運用している方式と、その説明ページの内容をコピーしておく。
$edit_auth_pages = array( '/Secret/' => 'hogefoobar', );
AuthUserFile /usr/local/apache/htdocs/basic/.htpasswd AuthGroupFile /dev/null AuthName "PukiWikiData" AuthType Basic require valid-user
///////////////////////////////////////////////// // ユーザ定義 $auth_users = array( -'foo' => 'foo_passwd', -'bar' => 'bar_passwd', -'hoge' => 'hoge_passwd', +// ユーザ名 => パスワード(md5 hash) +// pukiwiki.php?md5=pass のようにURLに入力し +// MD5ハッシュにしてから記入してください。 +'foo' => 'f122914144e12fa7d7b7b14cc223f671', +'bar' => 'f53ae779077e987718cc285b14dfbe86', +'hoge' => '0c165e4475e0726a1f4a5dc55647d992', );
// ユーザリストに含まれるいずれかのユーザと認証されればOK if (!isset($_SERVER['PHP_AUTH_USER']) or !in_array($_SERVER['PHP_AUTH_USER'],$user_list) or !array_key_exists($_SERVER['PHP_AUTH_USER'],$auth_users) - or $auth_users[$_SERVER['PHP_AUTH_USER']] != $_SERVER['PHP_AUTH_PW']) + or $auth_users[$_SERVER['PHP_AUTH_USER']] != md5($_SERVER['PHP_AUTH_PW'])) {
///////////////////////////////////////////////// // ユーザ定義 $auth_users = array( -'foo' => 'foo_passwd', -'bar' => 'bar_passwd', -'hoge' => 'hoge_passwd', +// ユーザ名 => パスワード(md5 hash) +// pukiwiki.php?md5=pass のようにURLに入力し +// MD5ハッシュにしてから記入してください。 +// 面倒ならば以下のようにどうぞ +// ユーザ名 => md5(パスワード) +'foo' => 'f122914144e12fa7d7b7b14cc223f671', +'bar' => 'f53ae779077e987718cc285b14dfbe86', +'hoge' => md5("hoge_passwd"), );
if (isset($retvars['body']) && $retvars['body'] != '') { $body = & $retvars['body']; } else { if ($base == '' || ! is_page($base)) { $base = & $defaultpage; $title = htmlspecialchars(strip_bracket($base)); $page = make_search($base); } $vars['cmd'] = 'read'; $vars['page'] = & $base; - $body = convert_html(get_source($base)); + if (check_readable($base, true, false)) { + $body = convert_html(get_source($base)); + } else { + global $title_cannot; + $body = str_replace('$1', htmlspecialchars(strip_bracket($page)), $title_cannot); + } }例えば、コメントプラグインでメッセージが空だった場合に、array('msg'=>'', 'body'=>'') と返してくるので、ノーチェックでconvert_html しています。他には、ページが存在しなかった場合は$defaultpage を読み込むようになっていますが、この場合も$defaultpage に制限がかかっているかをチェックしていません。 -- 2008-03-29 (土) 13:06:51
'/^☆.*$/' => 'tokubetu', (イ)のようにして、☆で始まるページは「tokubetu」ユーザにだけ閲覧させています。これに加え、後から「ippan」というユーザーも管理を始めました。
'/[^(FrontPage)]/'=> 'ippan,tokubetu', (ロ)という行も追加しました。つまり、フロントページは誰でも見られる。それ以外のページは、「ippan」「tokubetu」ユーザーが見られる。☆で始まるページは「tokubetu」ユーザーのみ。という運用を行いたいのですが、「ippan」ユーザーで☆で始まるページも閲覧出来てしまいます。(ロ)の行の記載では、たしかに☆で始まるページも含まれるのは理解しましたが、解決方法が分かりません。どのようにすれば良いのでしょうか。-- 2008-07-04 (金) 20:01:31
'/^☆.*$/' => 'tokubetu', '/^(?!^(FrontPage|^☆.*$)$).*$/' => 'ippan,tokubetu',が正解でした。 -- 2008-07-08 (火) 15:45:20