質問箱/3417

カテゴリ
サマリページごとにユーザに対して閲覧・編集を許可する方法
バージョン1.4.6
投稿者べるの?
状態完了
投稿日2006-05-22 (月) 17:38:44

質問

PukiWikiの閲覧・編集の制限について調べておりますが、不明な点があり、ご教授ください。

やりたいことは

 userA・・・閲覧専用ユーザ
 userB・・・グループB
 userC・・・グループC
 userD・・・管理者

に対して

 hoge1/hoge2/hogeB(userAに閲覧許可、userBとuserDに閲覧・編集を許可)
 hoge1/hoge2/hogeC(userAに閲覧許可、userCとuserDに閲覧・編集を許可)
 hoge1/hoge2/hogeD(userAに閲覧許可、userDに閲覧・編集を許可)
 その他のページは、全てのユーザに閲覧を許可

をやりたいのですが、「pukiwiki.ini.php」の 「Read auth regex」と「Edit auth regex」を編集して試しているのですが、うまくいきません。 そこで、これを実現させるためには、制限ページの正規表現を設定することで、実現可能ことなのでしょうか。ご教授ください。

回答

  • 実現可能です。質問文からでは何につまづいているのか解らないので、あなたがどのように設定してみたのか貼り付けてもらえれば効率よく指摘できると思います。(それとも「全部書いて」とおっしゃってますか?) -- 2006-05-22 (月) 19:11:40
  • 回答、ありがとうございます。 -- べるの? 2006-05-22 (月) 20:15:10

私が試した設定です。閲覧制限から試しています。

  • pukiwiki.ini.php
    $auth_users
    'userA'  => '{x-php-md5}passwd', //管理者
    'userB'  => '{x-php-md5}passwd', //グループA
    'userC'  => '{x-php-md5}passwd', //グループB
    'userD' => '{x-php-md5}passwd',  //閲覧専用
    
    $auth_method_type = 'pagename'; // By Page name
    
    $read_auth = 1;
    
    $read_auth_pages
    '#^page1.*$#' => 'userA,userB',
    '#^page2.*$#' => 'userA,userC',
    '#^page3.*#' => 'userA,userD',
    '#^.*$#'  => 'userA,userB,userC,userD',
  • ページ構成
    hoge1/hoge2/page1(管理者とグループAのユーザに閲覧を許可)
    hoge1/hoge2/page1/page1 Contact Box(管理者とグループAのユーザに閲覧を許可)
    hoge1/hoge2/page2(管理者とグループBのユーザに閲覧を許可)
    hoge1/hoge2/page2/page2 Contact Box(管理者とグループBのユーザに閲覧を許可)
    page3/(管理者と閲覧専用のユーザに閲覧を許可)
    page3/page3 Contact Box(管理者と閲覧専用のユーザに閲覧を許可)

上記のように設定を行い、私の認識だと「userB」が「page2」にアクセスすると、 Basic認証のダイアログが表示されると思っていたのですが、表示されずにアクセス できてしまいます。 制限ページ名の正規表現に「.*」を使用しているのは、「page1」の子ページを 作成するときに、「page1 ・・・」のように先頭に必ず「page1」をつけるように して、「page1」以下の子ページ全てを制限したいと考えたからです。 どのあたりが間違っているのか、ご教授お願いいたします。

  • 追記です。 -- べるの? 2006-05-23 (火) 17:30:59
    $edit_auth = 1;
    
    $edit_auth_pages
     '#^.*$#'  => 'userA',
     '#^page1.*$#' => 'userA, userB',
     '#^page2.*$#' => 'userA, userC',

書き込み制限は、上記設定により実現することができました。閲覧の制限は難しそうです。

  • 先頭に必ず「page1」? ページ構成では「hoge1」になっているが? -- 2006-05-23 (火) 20:14:15
  • ご指摘ありがとうございます。メソッドタイプが「pagename」になっていたので、ページ名を指定しています。試しに「ページパス」('#^hoge1\/hoge2\/page1.*$#')を指定して見ましたが、結果は同じでした。引き続き、何か思いついたらやってみます。 -- べるの? 2006-05-23 (火) 20:43:29
  • $read_auth_pagesの'#^.*$#' => 'userA,userB,userC,userD'により、全頁を全認証ユーザに対して閲覧許可していることになるので、「userB」が「page2」にアクセスしても当然何も起きません。べるのさんは閲覧制限が機能していないと誤認しているだけではないですか?つまり、やるべきことは思い付きをポチポチ試すことではなく、正規表現について学ぶことでしょう。極めて基本的なレベルで構いません。 -- 2006-05-23 (火) 20:51:35
    • 正規表現が保障するのは「'#^.*$#'」が全ての文字列にマッチすることだけであり、$read_auth_pages配列の複数のエントリに対してその全てを評価し、OR条件で権限が付与されるのはPukiWikiの仕様の問題なので正規表現についてどれだけ学んでも解決しないと思います。 -- 2006-05-24 (水) 00:37:41
  • まず、用語の問題で行き違いがあるようです。「$pagename」の評価対象はページ名のフルパス(べるのさんの言われる「ページパス」)です(PukiWikiでは通常「ページ名」という言葉はフルパスを指して使用します。*1)。なので、「'#^page1.*$#'」は「hoge1/hoge2/page1」にはマッチしません。適切な内容は2006-05-23 (火) 20:43:29にご自身で書かれた通りです(/のエスケープや末端の「.*$」は不要ですけど)。以上が用語の理解と正規表現の書式の問題です。 -- 2006-05-24 (水) 00:29:37
  • で、上で書いたように$read_auth_pagesの内容は全要素のORで評価されるので、「すべて」にマッチするエントリがあればそちらが優先されてしまいます(page2ではじかれるはずのuserBが「'#^.*$#'」で拾われてしまう)。なので、「全て('#^.*$#')」の代わりに、不恰好ですが「他のエントリ以外の全て」にマッチするように書いてやってください。たとえば「'#^(?!(AAA|BBB|CCC)).#'」のように。 -- 2006-05-24 (水) 00:51:12
  • ご指摘ありがとうございます。「'#^(?!(AAA|BBB|CCC)).#'」で他のエントリ以外の全てにマッチするように記述することで希望したとおりの動作を実現できました。ありがとうございます。 -- べるの? 2006-05-24 (水) 09:53:10
  • 「ページパス」→NG、「フルパス」→OKのご指摘ありがとうございます。ディレクトリの階層構造と表現を意図的に分けようと意識していたかも知れません。「/」のエスケープも不要だったのですね。質問箱を検索したら、エスケープしてあったのを見かけたので必要だと思っていました。ありがとうございます。 -- べるの? 2006-05-24 (水) 09:58:00
  • 秀丸で検索・置換に正規表現を利用していたので、少し知識はあったのですが、「?!」表現の意味が分からず使っておりませんでした。これは「.*」表現とは異なるのでしょうか? -- べるの? 2006-05-24 (水) 10:01:15
  • まとめです。 -- べるの? 2006-05-24 (水) 13:12:21

    以下、まとめです。

  • 実現したこと
    • ページ構成
      • hoge1/hoge2/page1(管理者とグループAのユーザに閲覧を許可)
      • hoge1/hoge2/page1/page1 Contact Box(管理者とグループAのユーザに閲覧を許可)
      • hoge1/hoge2/page2(管理者とグループBのユーザに閲覧を許可)
      • hoge1/hoge2/page2/page2 Contact Box(管理者とグループBのユーザに閲覧を許可)
      • page3/(管理者と閲覧専用のユーザに閲覧を許可)
      • page3/page3 Contact Box(管理者と閲覧専用のユーザに閲覧を許可)
      • その他のページは、全てのユーザに閲覧を許可
  • 設定
    • pukiwiki.ini.php
       // User definition
       $auth_users = 
         'userA'  => '{x-php-md5}passwd', //管理者
         'userB'  => '{x-php-md5}passwd', //グループA
         'userC'  => '{x-php-md5}passwd', //グループB
         'userD'  => '{x-php-md5}passwd', //閲覧専用
       
       // Authentication method
       $auth_method_type = 'pagename'; // By Page name
       
       // Read auth (0:Disable, 1:Enable)
       $read_auth = 1;
       
       // Read auth regex
       $read_auth_pages = array(
         '#^hoge1/hoge2/page1#' => 'userA,userB',
         '#^hoge1/hoge2/page2#' => 'userA,userB',
         '#^page3#' => 'userA,userD',
         '#^(?!(hoge1/hoge2/page1|hoge1/hoge2/page2|page3)).#'  => 'userA,userB,userC,userD',
       
       // Edit auth (0:Disable, 1:Enable)
       $edit_auth = 1;
       
       // Edit auth regex
       $edit_auth_pages = array(
         '#^.*$#'  => 'userA',
         '#^hoge1/hoge2/page1#' => 'userA,userB',
         '#^hoge1/hoge2/page2#' => 'userA,userC',

以上

正規表現がどのように評価されるか掴めましたので、正規表現をもっとスマートに記述できないか考えて見ます。ありがとうございました。


*1 これはPukiWikiの階層機能がページ名を利用した擬似的なものだからでしょう。あと「ページパス」という言葉は一般的ではありません・・・というか使われていません。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-30 (木) 03:17:17
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.241 sec.

OSDN