このサイトはAtlassian製品に関わるエンジニア有志で運営するコミュニティサイトです。コミュニティサイトに登録された情報については免責事項となります。
 
2
1
0

Confluenceのレイアウトで本文内を検索する

の続きの話になります。
皆さんのおかげで、ページ本体、コメント、ファイル一覧を非表示にするようにできたのですが、非表示にしたいユーザーでもページの編集ができてしまいます。

下記の様に、ページレイアウトのeditの$body出力部分を非表示にするようにしたのですが、$display_flgがfalseでも、ページの編集画面が通常通りに表示されてしまいました。

    ## EDIT || PREVIEW-EDIT
#elseif ($mode == "edit" || $mode == "edit-preview")
#if($display_flg)
$body
#else
<h1>このページは閲覧が許可されていません</h1>
#end

ページレイアウトで、編集行為そのものを無効化するか、編集画面を非表示にするような制御をしたいのですが可能でしょうか?

    CommentAdd your comment...

    1 answer

    1.  
      2
      1
      0

      関連QA

      カスタマイズが入り組んできて目的とする回答になっているか不安ですが…

      ページレイアウトを編集しても、ページの編集画面で通常通り表示されてしまう問題については

      ページ表示画面から編集ボタンを押したとき(もしくはキーボードショートカットで e を押したとき)は、JavaScriptでbody情報をJSONで取得しており、$mode としては view のままですのでレイアウトの分岐にはいきません。

      編集画面をリロードしたり、編集画面を別タブ・別ウィンドウで開いたときは $mode が edit になります。

      レイアウトの #if ($mode == "view") 文下に、以下のようなJavaScripを追加すれば、表示画面から編集画面に移動したときリロードがかかるようにはできますが…抜け穴はまだあるかと思います。

      #if ($mode == "view")
      <script>
      AJS.bind("init.rte", function() {
      location.reload(true);
      });
      </script>
      
      


      例えばレイアウトで非表示にすると一見見えないのですが

      メニューのソース表示、Word/PDF エクスポート、REST APIやWebDAV では、レイアウト処理を通らないので本文を閲覧することができてしまいます。申し訳ございません。


      そもそもの目的としては「Confluenceにタイトル以外の必須項目を追加したい」の

      タイトルに"外部閲覧可"の語句がない場合は内部グループのユーザーにのみ閲覧させるような形にしていこう

      ということであれば、ページの参照権限をレイアウト処理で強制的につけてしまうという方法もあるかと思います。

      そうすれば、そもそもページが見えないので編集のコントロールも不要ですし、メニューのソース表示、Word/PDF エクスポート、REST APIやWebDAV も閲覧できません。


      実現方法としては、例えば以下コードをレイアウトに埋め込めば、ページタイトルに「外部閲覧可」が設定されてない場合「閲覧しても大丈夫なグループ」にページ権限が設定されます。

      #if ($mode == "view")
      ## 閲覧してはいけない場合の条件チェック
      #set($display_flg = "false")
      #if ($page.getTitle().indexOf("外部閲覧可") != -1)
      #set($display_flg = "true")
      #end
      #if($display_flg == "false")
      ## contentPermissionManager 取得
      #set($containerManagerClass = $page.class.forName('com.atlassian.spring.container.ContainerManager'))
      #set($getInstanceMethod = $containerManagerClass.getDeclaredMethod('getInstance',null))
      #set($containerManager = $getInstanceMethod.invoke(null,null))
      #set($containerContext = $containerManager.containerContext)
      #set($contentPermissionManager = $containerContext.getComponent('contentPermissionManager'))
      
      #set($contentPermissionClass = $page.class.forName('com.atlassian.confluence.security.ContentPermission'))
      #set($contentPermission = $contentPermissionClass.newInstance())
      #set($viewPermissionField = $contentPermissionClass.getField("VIEW_PERMISSION"))
      #set($viewPermission = $viewPermissionField.get(null))
      
      #set($viewGroupReadPermission = $contentPermission.createGroupPermission($viewPermission, "閲覧しても大丈夫なグループ"))
      #set($contentViewPermissionSet = $page.getContentPermissionSet($viewPermission))
      ## 参照権限が設定されていない場合設定
      #if($contentViewPermissionSet.contains($viewGroupReadPermission))
      #else
      $contentPermissionManager.addContentPermission($viewGroupReadPermission, $page)
      #end
      #end
      #end

      (warning) 必ず検証環境で検証してください。


      この方法でも難しいとなる場合、要件を整理してアドオン開発などを検討したほうがいいかなと思います…。




      1. 蒼龍


        メニューのソース表示、Word/PDF エクスポート、REST APIやWebDAV では、レイアウト処理を通らないので本文を閲覧することができてしまいます。

        ということで、コンテンツ毎に表示の判定をしてても漏れが出るのではないかということになり、結局最終的に下記の様にページレイアウトのコンテンツを全部非表示にするような形になりました。

        display_flg計算処理
        #if($display_flg)
        ページレイアウトの全処理
        #else
        <h1>閲覧が許可されていません</h1>
        #end

        編集ボタンの表示もなくなり、Eボタン押しても編集のイベントは発火しなかったので、これで行こうと思います。お騒がせしました


      2. Kengo Ohsaki

        蒼龍-san,

        ご確認ありがとうございます。

        結果として御社運用が問題なければ幸いです。

      CommentAdd your comment...