访问控制 RBAC / ABAC 总览待审核
实例 · 可见性 / 能不能看见

可见性:内容「能不能看见」也是这个函数

朋友圈「仅三天可见」、公众号测试文「只有指定人能看」、视频「你所在地区不可观看」、课程「开通 VIP 解锁」、 ChatGPT「今日免费次数已用完」…… 这些看似五花八门的限制,其实是同一个函数:一次「把这条内容渲染给这个访客看吗」 的判定,输入还是 01-request 的那个四元组 —— who (访客身份与关系)、when/where (情境:地区 / 客户端 / 距发布多久)、 what (内容自身:审核状态 + 作者设定的可见范围)、action (看见 / 可回复)。

who
访客 + 关系
登录? 好友 / 关注者 / 指定人? VIP 等级? 累计消费?
when/where
情境
地区 / 客户端(App?) / App 版本 / 距发布天数 / 今日已用次数
what
这条内容
审核状态 + 作者设定的可见范围(仅好友 / 仅三天…)
action
view
看见 / 可回复 —— 同一条内容,看得见未必回得了
可见性 = 一串闸门 (guard) 的 AND:内容默认想展示,但要穿过若干道闸门 —— 审核、登录、好友、地区、VIP、次数…… 每一道都放行才可见,任意一道拦下就受限。这正是 05-decidedeny-overrides 的特例 (全是 deny 类规则、必须全过)。 与「准入型」授权不同的是:被拦下时不是仅返回「无权」,而是每道闸门都带一个 CTA (登录 / 开通 VIP / 下载 App / 关注作者…) —— 这就是 deny 携带的补救建议 (advice),和 permit 携带的 obligation 正好对称。

可见性闸门:换一个访客 / 换一个情境,看它从「可见」翻成「受限」

📄 内容 (what) —— 选一个预设,它会启用对应的几道闸门

内容状态

🚪 启用的闸门 (这就是 policy;可单独开关)

访客 (who) —— 身份与关系

与作者关系
会员 plan
Lv.1
¥120

情境 (when/where)

所在地区
客户端
v7.5
1 天前
2 / 5 次

闸门链 (亮 = 该内容启用了这道;绿 ✓ = 放行;红 ✕ = 拦下;高亮 = 访客实际撞上的第一道)

「全部通过才可见」= AND = deny-overrides:选「微信朋友圈动态」(默认启用仅好友 + 最近三天可见两道)。 访客是「陌生人」→ 第一道仅好友就拦下,受限。把关系切到好友 → 这道过了,但距发布拉到 5 天前 → 时间这道又拦下。两道都满足 (好友 + ≤3天) 才放行 —— 任意一道不过,整条内容就不可见。 UI 只展示「第一道没过的闸门」= first-applicable:同时有多道没过时,真实产品不会把「登录 / 开通 VIP / 下载 App」 全部同时弹出,而是按优先级挑最该先解决的那一道展示其 CTA (上面「你会看到的提示」)。这与 05-decidefirst-applicable「顺序即优先级」是同一回事 —— 闸门的排列顺序 (审核 → 登录 → 客户端 → 地区 → 关系 → 时间 → 付费 → 级别…) 就决定了先逼你过哪一关。

每种限制读的是哪个轴 (你列的 12 种,逐一归位)

它们之所以「看着不一样、其实一样」,是因为只是读了四元组里不同的字段。下表把每种可见性限制映回它读的轴、对应的现实例子, 以及第 01–05 页里的同一个概念:

可见性限制读哪个轴 / 字段现实例子policy 概念 (01–05)
审查what.status内容审核中 / 已下架时谁都看不到读资源属性的 deny 规则 (04 页)
App 限制where.client活动分享页:必须在 App 内打开才有功能环境 / 客户端条件 (03 页)
登录限制who.loggedIn未登录只给摘要 / 不给看匿名 vs 已认证主体 (02 页)
时间限制when 相对 what朋友圈三天 / 半年可见;软件试用期环境(时间)+ 资源属性 (03·04)
群体 / 好友 / 指定人whowhat 关系朋友圈分组;公众号测试期仅指定人可见基于关系的规则 = ReBAC 种子 (04 页)
付费限制who.planVIP 才能看 / 用主体属性规则 = ABAC (02 页)
级别 (sVIP) 限制who.plan + levelVIP 达到一定等级才解锁属性的阶梯比较 (像密级,02·04)
关注限制whowhat 关系豆瓣:关注用户才可见 / 可回复关系规则 + 区分 action(看 vs 回复)
地区限制where.region视频 / 音乐版权按地区授权环境(地点)条件 (03 页)
次数限制who 用量 + whenChatGPT 免费 N 次 / 天带状态的条件 (用量计数 + 每日重置)
消费额限制who.spend累计消费达额后解锁权益主体累积属性的阈值规则 (02 页)
软件版本限制where.appVersion旧版本不给用新功能 / 强制升级环境(客户端版本)条件 (03 页)
十二种限制,本质只是「读了 who / when·where / what 里的不同字段,再拼成一道 deny 闸门」。换字段 = 换限制。
一句话收束:别把「可见性」当成内容上一组零散开关。它就是一个 canSee(viewer, context, content, 'view') → 可见 | 受限 + 该走哪个 CTA 的函数 —— 一串 deny 闸门做 AND,失败时按优先级给出补救建议。理解了这一个函数,上面十二种、以及你以后遇到的第十三种,都是同一回事。

相关链接