保護されたカテゴリのトピックにアクセスしたユーザー

お手伝いできることがありますか?SQLについては全くの初心者です。

私は労働組合の掲示板の管理者を務めています。私は選挙で選ばれた代表ですが、指導部には所属していません。私が管理者をしている理由は、すでにDiscourseの経験があり、内部コミュニケーション(チームコラボレーション)を近代化するために設置したからです。また、現時点では20人中私だけが、ウェブビルダーを使ってサイトを作る以上の高度な技術的な裏方作業について何かを知っている唯一の人物です。つまり、私たちのグループはエンドユーザーとして技術に詳しいですが、「裏方」の技術には詳しくないということです。

これは私たち全員、指導部を含むための作業スペースですので、彼らが活動するためのいくつかのカテゴリーを設けましたが、私にはそれらを覗き見る権限はありません(私の給料の範囲を超えています)。

管理者からはコンテンツを完全に隠す方法がないため、以下の機能をCSSを含むテーマコンポーネントで実装しました:

  • ユーザープロフィールのメッセージボタンを非表示
  • 管理者プロフィールのなりすましボタンを非表示
  • カテゴリーページでのカテゴリーのトピックプレビューを非表示
  • カテゴリー内のトピック一覧を全員から非表示
    • その後、特定の(プライマリの)グループのメンバーにのみトピック一覧の表示権限を付与

結論から言うと、私が覗き見をしていないか確認できるように、ログと監査証跡のシリーズを作成しています。

  1. サイトログで、彼らが気づかないうちに私がそのテーマコンポーネントを編集したり無効にしたりしたかどうかを確認できます。理由を問い詰められ、詳細を確認することも可能です。
  2. 仮に私がなりすまし機能やメッセージ閲覧機能を使用した場合、これもログに残ります。

つまり、私がこれらの隠蔽のために書いたCSSをいじった場合、彼らはそれを見て私に説明を求められます。

  1. もし私が自分自身を彼らのグループに追加してコンテンツを閲覧可能にした場合、グループログに自分が追加/削除した記録が残ります。彼らは私に説明を求められます。

私が助けを必要としている点:
もし私がCSSスタイルシートを無効にしてページを表示した場合、トピックのURLが見えてしまいます。当然、トピックを直接開くことも可能です。私が欲しいのは、彼ら(全員が管理者アクセスを持つ執行部)が時折実行できるデータエクスプローラーのクエリで、"executive"グループのメンバーではないユーザーが特定のカテゴリー内で閲覧したトピックを表示するものです。

彼らはこれが可能だと知りませんが、あらゆる可能性をカバーしたいと考えています。利用可能なツールでできる限りの未来への備えをしたいのです。

つまり、私が求めているデータエクスプローラーのクエリは以下の通りです:

  1. ユーザーが “executive” グループのメンバーでない場合
  2. カテゴリー “EB”(またはカテゴリーID: 34)でユーザーが閲覧したトピックを表示

これに私が適用したCSSによる白塗り(非表示化)を組み合わせることで、もし誰か(私、あるいは将来管理者アクセスを与えられる可能性のある執行部以外の誰か)がそのカテゴリー内のトピックを閲覧した場合、それが意図的な覗き見であることが明確になる十分な記録を残すことができます。そのためには、彼らが相当な手間をかけて意図的に行動したことになります。

どなたかお手伝いできませんか?

これについては新しいトピックを立てるべきだと思いますが…

ただ、試してみることはできますし(SQL も学べますよ) :wink:

ポイント 1:

-- [params]
-- string :gname = executive
-- string :uname = SidV
SELECT u.username, g.id as "group id", g.name
FROM group_users gu, users u, groups g
WHERE g.id = gu.group_id
AND u.id = gu.user_id
AND g.name ILIKE :gname
AND u.username ILIKE :uname

ポイント 2

あなたの意図がわかりません…何が必要なのでしょうか?

クエリリストを確認して、あなたのニーズに合わせてクエリを調整してみてください。

basically、グループ A に属さないすべてのユーザーがカテゴリ 1 または 2 で読んだトピックを表示するクエリを作成してください。

保護されたカテゴリ内のトピックにアクセスしたユーザー

このクエリは、クエリの :group_name で指定されたグループのメンバーではない、トピックを閲覧または投稿したすべての topic_users(トピックユーザー)を返します。ただし、カテゴリのセキュリティ設定にそのグループが含まれているトピックに限ります。これにより、グループ権限が追加されたカテゴリ内のトピックを閲覧した管理者を検出できます。

--[params]
-- string :group_name

WITH allowed_users AS (
SELECT user_id
FROM group_users gu
JOIN groups g
ON g.id = gu.group_id
WHERE g.name = :group_name
),
group_categories AS (
SELECT category_id
FROM category_groups cg
JOIN groups g
ON g.id = cg.group_id
WHERE g.name = :group_name
)

SELECT
tu.user_id,
tu.topic_id,
tu.last_visited_at::date
FROM topic_users tu
JOIN topics t
ON t.id = tu.topic_id
WHERE t.category_id IN (SELECT category_id FROM group_categories)
AND tu.user_id NOT IN (SELECT user_id FROM allowed_users)
ORDER BY t.category_id