Page 1 of 1

如何存储用户的个人隐私设置(如谁能看我的头像、状态)?

Posted: Tue May 20, 2025 11:14 am
by muskanislam99
在像 WhatsApp 这样的隐私敏感型应用中,用户的个人隐私设置的存储至关重要。这些设置决定了哪些信息(如头像、状态、最后上线时间)对哪些其他用户可见。存储这些设置需要考虑灵活性、可扩展性、快速查询、一致性以及安全性。

1. 核心存储位置:用户隐私设置表 (UserPrivacySettings Table)
最直接和结构化的方法是创建一个专门的数据库表来存储用户的隐私设置。

表结构示例:

SQL

CREATE TABLE UserPrivacySettings (
user_id BIGINT PRIMARY KEY, -- 外键,关联 Users.user_id
last_seen_privacy VARCHAR(20) NOT NULL DEFAULT 'EVERYONE', -- 谁能看我的最后上线时间
profile_photo_privacy VARCHAR(20) NOT NULL DEFAULT 'EVERYONE', -- 谁能看我的头像
about_privacy VARCHAR(20) NOT NULL DEFAULT 'EVERYONE', -- 谁能看我的“关于”信息/状态消息
status_privacy VARCHAR(20) NOT NULL DEFAULT 'EVERYONE', -- 谁能看我的状态更新(Stories)
read_receipts_enabled BOOLEAN NOT NULL DEFAULT TRUE, -- 是否开启已读回执
groups_privacy VARCHAR(20) NOT NULL DEFAULT 'EVERYONE', -- 谁能把我拉进群组
live_location_privacy VARCHAR(20) NOT NULL DEFAULT 'NOBODY', -- 谁能看到我的实时位置
updated_at BIGINT NOT NULL, -- 最后更新时间戳

-- 以下字段用于存储“我的联系人,除了...”和“只与以下对象共享...”的例外列表
-- 可以是 JSONB,也可以是独立的关联表
last_seen_exceptions_json JSONB,
profile_photo_exceptions_json JSONB,
about_exceptions_json JSONB,
status_exceptions_json JSONB
-- FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
字段值类型:

枚举类型(VARCHAR): 对于像 last_seen_privacy 这样的字段,通常会使用预定义的枚举值,如:
'EVERYONE' (所有人)
'MY_CONTACTS' (我的联系人)
'MY_CONTACTS_EXCEPT' (我的联系人,除了...)
'NOBODY' (无人)
布尔类型(BOOLEAN): 对于简单的开关设置,如 read_receipts_enabled。
JSONB / TEXT: 对于需要存储例外列表的设置(例如,“我的联系人,除了……”或“只与以下对象共享……”),使用 JSONB (PostgreSQL) 或 TEXT 存储一个包含用户 ID 数组的 JSON 对象是常见的做法。例如:
JSON

{ "excluded_users": ["user123", "user456"] }
或者
JSON

{ "included_users": ["user789", "user012"] }
选择 JSONB 的优点是数据库可以索引和查询 JSON 内部的数据,效率更高。
2. 查询和验证机制
当用户 A 尝试查看用户 B 的头像、状态或最后上线时间时,WhatsApp 服务器需要执行以下验证逻辑:

查询用户 B 的隐私设置: 从 UserPrivacySettings 表中获取用户 B 的相关隐私设置(例如 profile_photo_privacy 的值)。
根据设置进行判断:
如果设置为 'EVERYONE':允许查看。
如果设置为 'NOBODY':不允许查看。
如果设置为 'MY_CONTACTS':
服务器需要检查用户 A 是否在用户 B 的联系人 柬埔寨 whatsapp 数据库 列表中(或者反之,用户 B 是否在用户 A 的联系人列表中,具体取决于 WhatsApp 的联系人同步和关系模型)。这通常通过查询 UserContacts 表来完成。
如果用户 A 是用户 B 的联系人,则允许查看;否则不允许。
如果设置为 'MY_CONTACTS_EXCEPT' 或 ONLY_SHARE_WITH(后者在 WhatsApp 中实际是“只与以下对象共享...”):
服务器需要首先检查用户 A 是否在用户 B 的联系人列表中。
然后,进一步检查用户 A 是否在 exceptions_json 字段中定义的排除或包含列表中。
例如,如果是 MY_CONTACTS_EXCEPT,并且用户 A 在排除列表中,则不允许查看。
3. 可扩展性与性能
分片(Sharding): UserPrivacySettings 表通常会与 Users 表一起进行分片,因为它们是用户核心信息的一部分。分片键通常是 user_id。这样,查询某个用户的隐私设置就直接路由到对应的分片,保证了查询性能。
缓存: 由于隐私设置会被频繁查询(每次查看联系人信息时),这些设置应该被高度缓存。
服务器端缓存: 使用 Redis 或 Memcached 等分布式缓存来缓存用户的隐私设置。
客户端缓存: 用户的 WhatsApp 客户端也会在本地缓存其联系人的部分隐私设置。当设置发生变化时,服务器会推送通知给相关的客户端进行更新。
4. 实时更新与通知
当用户修改其隐私设置时:
客户端发送更新请求到服务器。
服务器更新 UserPrivacySettings 表中的相应记录。
服务器更新其内部缓存。
通知受影响的用户: 如果某个隐私设置的改变会影响到其他用户(例如,从“所有人可见”变为“无人可见”),服务器可能需要向相关的客户端发送一个“联系人信息更新”通知。这些客户端会拉取最新的设置并更新其本地显示。
5. 隐私与安全
数据加密: 尽管隐私设置本身不包含敏感的明文通信内容,但作为用户数据的一部分,也应受到适当的加密保护(例如,静态加密)。
访问控制: 严格的数据库访问权限控制,只有授权的服务和应用程序才能修改这些设置。
合规性: 遵守 GDPR、CCPA 等数据隐私法规,确保用户对其数据的控制权。
通过这种结构化的存储和精细的验证机制,WhatsApp 能够有效地管理和实施用户的个人隐私设置,确保用户对其信息可见性的高度控制。