细粒度访问控制(Fine-Grained Access Control, FGAC)是指在比“角色/用户”更细的层级上控制“谁能对什么数据、在什么条件下、做什么操作”。下面从设计思路 → 常见模型 → 技术实现 → 实战示例四个层面系统说明。
实现细粒度访问控制,通常要回答四个问题(ABAC 经典模型):
越能动态组合这 4 个维度,控制越“细”。
| 模型 | 粒度 | 特点 | 适用场景 |
|---|---|---|---|
| RBAC | 中 | 角色绑定权限 | 传统系统 |
| ABAC | 细 | 属性驱动策略 | 多租户、复杂业务 |
| PBAC | 更细 | 策略即代码 | 云原生、合规 |
| DAC / MAC | 粗/强 | 自主 / 强制 | 操作系统、军工 |
✅ 细粒度首选:ABAC / PBAC
在代码/网关中做判断:
if (user.deptId != doc.ownerDeptId) {
throw new AccessDeniedException();
}
✅ 灵活
❌ 易散落、难维护
通过策略引擎统一拦截:
- path: /order/*
method: GET
condition:
user.role: sales
user.region: == resource.region
✅ 集中管控
❌ 只到 API 级
数据库原生支持:
CREATE POLICY user_policy
ON orders
FOR SELECT
USING (owner_id = current_user_id());
✅ 真正“数据级细粒度”
✅ 绕过应用也生效
{
"fields": {
"salary": "deny",
"email": "mask"
}
}
用户请求
↓
API Gateway(认证 + 粗粒度)
↓
Policy Engine(OPA / Casbin)
↓
业务服务(逻辑判断)
↓
数据库(RLS / VPD)
销售只能看自己区域内的订单
allow {
input.user.role == "sales"
input.user.region == input.resource.region
}
{
"user": {"role": "sales", "region": "East"},
"resource": {"region": "East"}
}
✅ 允许访问
如果你愿意,可以告诉我:
我可以直接给你可落地的代码方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。