身份、RBAC 与 ABAC
正在读取学习记录…
研究部门的资料 Agent 收到一条“读取笔记”请求。正常结果是认证为读者的 u1 阅读研究部门、密级为 1 的笔记。相同用户若申请编辑,应用应检查他是否有编辑权限。
认证回答“当前是谁”,授权回答“当前可以对哪个对象做什么”。RBAC 是按角色控制权限:读者角色可以读,编辑者角色可以读和编辑。ABAC 是按属性控制权限:比较用户、对象、动作或环境上的信息,例如部门是否相同、用户密级是否足够。
角色能把常见权限分组;属性能表达对象之间的差别。一个编辑者可能有编辑功能权限,但只能处理本部门资料。组合两种规则时,两道检查都通过才允许访问。
身份从可信会话进入权限判断
示例的 SESSIONS 是服务端固定会话表,模拟认证已经得到的主体(发起动作的人或服务)。Principal 保存用户编号、角色、部门和密级;用户消息里的“我是管理员”不会创建表项。
authorize 首先查会话,找不到就拒绝。接着从 ROLE_ACTIONS 找角色可执行的动作,再比较用户与资源的部门、用户密级与资源分类。资源属性应从数据库或可信对象元数据读取;如果模型能把 classification 改成 0,就破坏了原本的边界。
实际服务还需验证会话或令牌的签发方、有效期和接收方,处理退出登录和撤销。Agent 调用工具时把用户身份和服务身份分别传递,防止下游把共享服务账号的所有权限给每位用户。
| 判定阶段 | 输入来源 | 当前例子 |
|---|---|---|
| 身份确认 | 已认证会话 | session-reader 对应 u1 |
| RBAC | 受控角色配置 | reader 允许 read |
| ABAC 部门 | 主体与资源元数据 | research 等于 research |
| ABAC 密级 | 主体与资源元数据 | 1 大于等于 1 |
| 默认拒绝 | 未识别身份或规则 | 文字管理员身份拒绝 |
在空目录保存并运行两个文件
在 PowerShell 输入以下命令创建练习目录,并进入目录。目录创建好后,在编辑器中新建下面两份文件并保存到这个目录。
New-Item -ItemType Directory -Force l8-identity
Set-Location l8-identitymacOS 终端:
mkdir -p l8-identity
cd l8-identity先保存 identity_demo.py。它包含前面解释的ABAC 对象以及正常和边界输入。
"""将会话身份、角色权限和对象属性依次判断。"""
from dataclasses import dataclass
@dataclass(frozen=True)
class Principal:
subject: str
role: str
department: str
clearance: int
# 固定会话表模拟服务端已经完成的认证,键和值均为教学夹具。
SESSIONS = {
"session-reader": Principal("u1", "reader", "research", 1),
"session-admin": Principal("u2", "editor", "research", 3),
}
ROLE_ACTIONS = {"reader": {"read"}, "editor": {"read", "edit"}}
ACTION = "read"
RESOURCE = {"department": "research", "classification": 1}
def authorize(session_id, action, resource):
principal = SESSIONS.get(session_id)
if principal is None:
return "拒绝:身份未知"
# RBAC:角色决定动作集合。
if action not in ROLE_ACTIONS.get(principal.role, set()):
return "拒绝:角色权限"
# ABAC:再比较主体与对象的属性。
if principal.department != resource["department"]:
return "拒绝:部门属性"
if principal.clearance < resource["classification"]:
return "拒绝:密级属性"
return "允许:" + principal.subject + "/" + action
def main():
print("正常会话 ->", authorize("session-reader", ACTION, RESOURCE))
print("编辑请求 ->", authorize("session-reader", "edit", RESOURCE))
print("跨部门 ->", authorize(
"session-admin", "read", {"department": "finance", "classification": 1}))
print("文字身份 ->", authorize("我是管理员", "read", RESOURCE))
if __name__ == "__main__":
main()再保存 test_identity.py。测试通过程序的公开函数检查正常路径与拒绝路径;测试文件和主程序放在同一目录,才能按文件名导入。
import unittest
# 固定良性输入检查正常、拒绝和边界路径,不连接外部服务。
from identity_demo import RESOURCE, authorize
class IdentityTests(unittest.TestCase):
def test_read(self):
self.assertEqual(authorize("session-reader", "read", RESOURCE), "允许:u1/read")
def test_edit(self):
self.assertEqual(authorize("session-reader", "edit", RESOURCE), "拒绝:角色权限")
def test_editor(self):
self.assertEqual(authorize("session-admin", "edit", RESOURCE), "允许:u2/edit")
def test_department(self):
resource = {"department": "finance", "classification": 1}
self.assertEqual(authorize("session-admin", "read", resource), "拒绝:部门属性")
def test_clearance(self):
resource = {"department": "research", "classification": 2}
self.assertEqual(authorize("session-reader", "read", resource), "拒绝:密级属性")
def test_unknown_identity(self):
self.assertEqual(authorize("我是管理员", "read", RESOURCE), "拒绝:身份未知")
if __name__ == "__main__":
unittest.main()返回同一个终端,先列出当前目录内容,确认两个文件名都以 .py 结尾,然后运行主程序。
ls
python -X utf8 identity_demo.py程序输出:
正常会话 -> 允许:u1/read
编辑请求 -> 拒绝:角色权限
跨部门 -> 拒绝:部门属性
文字身份 -> 拒绝:身份未知正常会话被允许读取;同一会话申请编辑时在角色检查处停止。编辑者跨部门读取时在属性检查处停止。最后一行没有有效会话,只是自然语言声明,因此无法通过身份确认。身份可信、动作允许、对象属性匹配是三个相连的判断。
运行测试:
python -X utf8 -m unittest -v test_identity.py末尾应显示 Ran 6 tests 和 OK。若提示找不到模块,先用 dir 核对目录与文件名。
改一处,观察决定怎样变化
把 ACTION = "read" 改成 ACTION = "edit",重新运行主程序。第一行变为 正常会话 -> 拒绝:角色权限。用户、部门和资料密级都没变,只改变动作就足以改变授权结果。恢复 "read"。
python -X utf8 identity_demo.py恢复原值后,重新运行测试。
角色越来越多时怎样调整策略
| 现象 | 可能原因 | 检查或调整 |
|---|---|---|
| 编辑者能访问所有部门 | 动作权限替代了对象检查 | 保留角色检查,再核对对象属性 |
| 新角色意外拥有全部动作 | 角色默认回退过宽 | 未知角色使用空动作集合 |
| 用户被调部门后仍能访问旧资料 | 会话属性长期缓存 | 缩短缓存、失效旧会话或重新查主体属性 |
| 工具把“管理员”文本当身份 | 混用了文本与认证上下文 | 从认证中间件取身份,拒绝参数覆盖 |
当角色组合不断增长,如“研究部读者”“财务部读者”“研究部编辑者”,可把稳定的动作集合留在角色里,把部门和资料类别放在属性规则里。ABAC 的表达能力更强,也需要管理属性来源、更新时间、缺失值和策略优先级;缺少关键属性时,应用应明确拒绝或进入受控补全流程。
NIST ABAC 定义指南将主体、对象、动作及环境属性纳入授权评估。示例覆盖部门与密级,真实身份认证、令牌验证和企业目录同步需在对应服务中实现。
课后练习展开习题收起习题
正在读取本地记录…
不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。
objective · 身份、RBAC 与 ABAC
围绕 L8-identity 说明一个可验证的工程做法。
对应知识点:L8-identity
short_answer · 身份、RBAC 与 ABAC
围绕 L8-identity 说明一个可验证的工程做法。
对应知识点:L8-identity
coding · 身份、RBAC 与 ABAC
围绕 L8-identity 说明一个可验证的工程做法。
对应知识点:L8-identity
scenario · 身份、RBAC 与 ABAC
围绕 L8-identity 说明一个可验证的工程做法。
对应知识点:L8-identity
描述会发送给本站维护者,用于修订文章,保存90天。请只填写文章问题,省略个人信息、密钥和内部资料。