可见性:内容「能不能看见」也是这个函数
朋友圈「仅三天可见」、公众号测试文「只有指定人能看」、视频「你所在地区不可观看」、课程「开通 VIP 解锁」、 ChatGPT「今日免费次数已用完」…… 这些看似五花八门的限制,其实是同一个函数:一次「把这条内容渲染给这个访客看吗」 的判定,输入还是 01-request 的那个四元组 —— who (访客身份与关系)、when/where (情境:地区 / 客户端 / 距发布多久)、 what (内容自身:审核状态 + 作者设定的可见范围)、action (看见 / 可回复)。
who
访客 + 关系
登录? 好友 / 关注者 / 指定人? VIP 等级? 累计消费?
when/where
情境
地区 / 客户端(App?) / App 版本 / 距发布天数 / 今日已用次数
what
这条内容
审核状态 + 作者设定的可见范围(仅好友 / 仅三天…)
action
view
看见 / 可回复 —— 同一条内容,看得见未必回得了
AND:内容默认想展示,但要穿过若干道闸门 —— 审核、登录、好友、地区、VIP、次数……
每一道都放行才可见,任意一道拦下就受限。这正是 05-decide 中 deny-overrides 的特例 (全是 deny 类规则、必须全过)。
与「准入型」授权不同的是:被拦下时不是仅返回「无权」,而是每道闸门都带一个 CTA (登录 / 开通 VIP / 下载 App / 关注作者…) ——
这就是 deny 携带的补救建议 (advice),和 permit 携带的 obligation 正好对称。
可见性闸门:换一个访客 / 换一个情境,看它从「可见」翻成「受限」
📄 内容 (what) —— 选一个预设,它会启用对应的几道闸门
内容状态
🚪 启用的闸门 (这就是 policy;可单独开关)
● 访客 (who) —— 身份与关系
与作者关系
会员 plan
Lv.1
¥120
● 情境 (when/where)
所在地区
客户端
v7.5
1 天前
2 / 5 次
闸门链 (亮 = 该内容启用了这道;绿 ✓ = 放行;红 ✕ = 拦下;高亮 = 访客实际撞上的第一道)
first-applicable「顺序即优先级」是同一回事 —— 闸门的排列顺序 (审核 → 登录 → 客户端 → 地区 → 关系 → 时间 → 付费 → 级别…)
就决定了先逼你过哪一关。
每种限制读的是哪个轴 (你列的 12 种,逐一归位)
它们之所以「看着不一样、其实一样」,是因为只是读了四元组里不同的字段。下表把每种可见性限制映回它读的轴、对应的现实例子, 以及第 01–05 页里的同一个概念:
| 可见性限制 | 读哪个轴 / 字段 | 现实例子 | policy 概念 (01–05) |
|---|---|---|---|
| 审查 | what.status | 内容审核中 / 已下架时谁都看不到 | 读资源属性的 deny 规则 (04 页) |
| App 限制 | where.client | 活动分享页:必须在 App 内打开才有功能 | 环境 / 客户端条件 (03 页) |
| 登录限制 | who.loggedIn | 未登录只给摘要 / 不给看 | 匿名 vs 已认证主体 (02 页) |
| 时间限制 | when 相对 what | 朋友圈三天 / 半年可见;软件试用期 | 环境(时间)+ 资源属性 (03·04) |
| 群体 / 好友 / 指定人 | who↔what 关系 | 朋友圈分组;公众号测试期仅指定人可见 | 基于关系的规则 = ReBAC 种子 (04 页) |
| 付费限制 | who.plan | VIP 才能看 / 用 | 主体属性规则 = ABAC (02 页) |
| 级别 (sVIP) 限制 | who.plan + level | VIP 达到一定等级才解锁 | 属性的阶梯比较 (像密级,02·04) |
| 关注限制 | who↔what 关系 | 豆瓣:关注用户才可见 / 可回复 | 关系规则 + 区分 action(看 vs 回复) |
| 地区限制 | where.region | 视频 / 音乐版权按地区授权 | 环境(地点)条件 (03 页) |
| 次数限制 | who 用量 + when | ChatGPT 免费 N 次 / 天 | 带状态的条件 (用量计数 + 每日重置) |
| 消费额限制 | who.spend | 累计消费达额后解锁权益 | 主体累积属性的阈值规则 (02 页) |
| 软件版本限制 | where.appVersion | 旧版本不给用新功能 / 强制升级 | 环境(客户端版本)条件 (03 页) |
canSee(viewer, context, content, 'view') → 可见 | 受限 + 该走哪个 CTA 的函数 ——
一串 deny 闸门做 AND,失败时按优先级给出补救建议。理解了这一个函数,上面十二种、以及你以后遇到的第十三种,都是同一回事。
相关链接
- 回看:决策与组合算法 (deny-overrides·first-applicable 都在这)@vega/playground可见性 = 全是 deny 的 deny-overrides;展示哪个 CTA = first-applicable。
- 回看:what —— 资源属性与「关系」@vega/playground仅好友 / 关注 / 指定人,都是 who↔what 的关系判定 (ReBAC 种子)。
- 对照:feature flag —— 输出 variant 而非 permit/deny@vega/playground同样是「who → 看到哪一版」,可见性是它退化成「看得见 / 看不见」的二元情形。