You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为IHP DataSync编写ChatMessages高级安全策略?

为ChatMessages创建组级访问安全策略

数据库结构

Users: id, name
Group: id, room_id
Rooms: id
ChatMessages: id, body, user_id, room_id, created_at

策略实现思路

要让组内成员能访问对应房间的所有聊天消息及发送者名称,核心是通过当前登录用户关联到所属组,再绑定到对应房间,以此限制消息的访问范围。

创建SELECT安全策略

根据用户与组的关联模式选择对应代码:

场景1:单用户对应一个组(Group表包含user_id字段)

CREATE POLICY "组内成员可访问对应房间的聊天消息及用户名"
ON "ChatMessages"
FOR SELECT
USING (
    EXISTS (
        SELECT 1
        FROM "Group"
        WHERE "Group"."user_id" = ihp_user_info()->>'id'::uuid
        AND "Group"."room_id" = "ChatMessages"."room_id"
    )
)
WITH CHECK (true);

场景2:多用户共享一个组(通过中间表UserGroup关联,表结构:UserGroup(user_id, group_id))

CREATE POLICY "组内成员可访问对应房间的聊天消息及用户名"
ON "ChatMessages"
FOR SELECT
USING (
    EXISTS (
        SELECT 1
        FROM "Group"
        JOIN "UserGroup" ON "UserGroup"."group_id" = "Group"."id"
        WHERE "UserGroup"."user_id" = ihp_user_info()->>'id'::uuid
        AND "Group"."room_id" = "ChatMessages"."room_id"
    )
)
WITH CHECK (true);

策略说明

  • 通过ihp_user_info()获取当前登录用户ID,关联Group表锁定用户所属组对应的房间,确保用户仅能访问该房间下的聊天消息。
  • WITH CHECK (true)允许关联Users表查询发送者名称,避免关联查询被安全策略拦截。

测试验证

登录目标用户后执行以下查询,仅会返回该用户所属组对应房间的消息及发送者名称:

SELECT cm.*, u.name AS sender_name
FROM "ChatMessages" cm
JOIN "Users" u ON cm.user_id = u.id;

内容的提问来源于stack exchange,提问作者Varun Rajput

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:17:35