访问受保护分类中主题的用户

我需要一些帮助。我对 SQL 一窍不通。

我正在为一个工会的论坛担任管理员。我是一名选举产生的代表,但并非领导层成员。我之所以担任管理员,是因为我已有使用 Discourse 的经验,我将其部署以现代化我们的内部沟通方式(团队协作),而且目前在我们 20 人中,只有我具备任何超出使用网页构建器搭建网站的技术能力,能够处理更高级的后台技术工作。总之,我们团队在作为终端用户方面具备技术素养,但并不精通“幕后”技术。

由于这是包含领导层在内的所有人的工作空间,我为他们设立了一些专门的工作分类,而我本不应窥探其中的内容(可以说这超出了我的职权范围)。

由于实际上无法完全向管理员隐藏内容,我创建了一个包含 CSS 的主题组件来实现以下功能:

  • 隐藏用户个人资料中的“消息”按钮
  • 隐藏管理员个人资料中的“模拟用户”按钮
  • 在分类页面隐藏分类的帖子预览
  • 向所有人隐藏分类内的帖子列表
    • 然后仅向属于(主要)某个特定组的成员显示帖子列表

总而言之,我正在建立一系列日志和审计追踪,以便在他们需要时检查我是否进行了窥探。

  1. 他们可以通过查看站点日志,确认我是否在他们不知情的情况下编辑或禁用了该主题组件;如果有,他们可以询问原因并查看详细信息。
  2. 如果我使用了“模拟用户”或“查看消息”功能,这些操作也会记录在日志中。

基本上,如果我篡改了用于隐藏这些内容的 CSS,他们就能发现并要求我解释。

  1. 如果我将自己添加到他们的组中以便查看内容,组日志会显示我添加或移除自己的记录。他们同样可以要求我解释。

我需要帮助的是:
如果我禁用了 CSS 样式表并查看页面,我就能看到帖子的 URL。显然,我可以直接打开这些帖子。我希望他们(所有拥有管理员权限的执行团队)能够定期运行一个数据探索器(Data Explorer)查询,以显示任何非“执行”组成员在特定分类中查看过的帖子。

他们并不知道这可以实现,但我希望确保万无一失。我想利用现有的工具尽可能做到未雨绸缪。

因此,我再次需要这样一个数据探索器查询来实现:

  1. 如果用户不属于“executive”组
  2. 则显示该用户在“EB”分类(或分类 ID:34)中查看过的帖子

结合我应用的 CSS 空白化方案,这将形成足够的书面记录,证明如果任何人(包括我,或未来可能被授予管理员权限但非执行团队成员的人)查看了该分类内的帖子,且他们不属于执行团队,那么他们必然是刻意费尽心机进行了窥探。

有人能帮忙吗?

我认为你应该为此开启一个新主题……

不过,你可以尝试一下(顺便学习 SQL);)

第 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 点

我不太理解你的意思……你需要什么?

查看查询列表,并尝试根据你的需求调整某些查询。

基本上,编写一个查询以显示任何未分配给 A 组的用户在类别 1 或 2 中阅读过的任何主题。

已访问受保护分类中主题的用户

此查询将返回所有 topic_users(查看过或在主题中发帖的用户),这些用户不属于查询的 :group_name 所指定的组,且这些主题所在的分类在其安全设置中包含了该组。此查询可用于查找已访问具有组权限的分类中主题的管理员。

--[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