AgentDepthAgent 工程学习指南
输入概念或问题,检索正文和待编写目录。
第一次学习?从 L0 总览开始 →

身份、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
默认拒绝未识别身份或规则文字管理员身份拒绝
身份、RBAC 与 ABAC中输入、检查和结果分支的关系
图1:会话提供可信身份,RBAC检查当前动作,ABAC检查部门与密级;三步通过才读取资料。

在空目录保存并运行两个文件

在 PowerShell 输入以下命令创建练习目录,并进入目录。目录创建好后,在编辑器中新建下面两份文件并保存到这个目录。

PowerShell
New-Item -ItemType Directory -Force l8-identity
Set-Location l8-identity

macOS 终端:

Bash
mkdir -p l8-identity
cd l8-identity

先保存 identity_demo.py。它包含前面解释的ABAC 对象以及正常和边界输入。

Python
"""将会话身份、角色权限和对象属性依次判断。"""
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。测试通过程序的公开函数检查正常路径与拒绝路径;测试文件和主程序放在同一目录,才能按文件名导入。

Python
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 结尾,然后运行主程序。

Bash
ls
python -X utf8 identity_demo.py

程序输出:

TXT
正常会话 -> 允许:u1/read
编辑请求 -> 拒绝:角色权限
跨部门 -> 拒绝:部门属性
文字身份 -> 拒绝:身份未知

正常会话被允许读取;同一会话申请编辑时在角色检查处停止。编辑者跨部门读取时在属性检查处停止。最后一行没有有效会话,只是自然语言声明,因此无法通过身份确认。身份可信、动作允许、对象属性匹配是三个相连的判断。

运行测试:

Bash
python -X utf8 -m unittest -v test_identity.py

末尾应显示 Ran 6 tests 和 OK。若提示找不到模块,先用 dir 核对目录与文件名。

改一处,观察决定怎样变化

把 ACTION = "read" 改成 ACTION = "edit",重新运行主程序。第一行变为 正常会话 -> 拒绝:角色权限。用户、部门和资料密级都没变,只改变动作就足以改变授权结果。恢复 "read"。

Bash
python -X utf8 identity_demo.py

恢复原值后,重新运行测试。

角色越来越多时怎样调整策略

现象可能原因检查或调整
编辑者能访问所有部门动作权限替代了对象检查保留角色检查,再核对对象属性
新角色意外拥有全部动作角色默认回退过宽未知角色使用空动作集合
用户被调部门后仍能访问旧资料会话属性长期缓存缩短缓存、失效旧会话或重新查主体属性
工具把“管理员”文本当身份混用了文本与认证上下文从认证中间件取身份,拒绝参数覆盖

当角色组合不断增长,如“研究部读者”“财务部读者”“研究部编辑者”,可把稳定的动作集合留在角色里,把部门和资料类别放在属性规则里。ABAC 的表达能力更强,也需要管理属性来源、更新时间、缺失值和策略优先级;缺少关键属性时,应用应明确拒绝或进入受控补全流程。

NIST ABAC 定义指南将主体、对象、动作及环境属性纳入授权评估。示例覆盖部门与密级,真实身份认证、令牌验证和企业目录同步需在对应服务中实现。

课后练习展开习题收起习题

4 道练习 · 客观题规则评分 · 其余题目待批改

正在读取本地记录…

不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。

练习 1 / 4 · v1.0.0

objective · 身份、RBAC 与 ABAC

围绕 L8-identity 说明一个可验证的工程做法。

对应知识点:L8-identity

选择一个答案
练习 2 / 4 · v1.0.0

short_answer · 身份、RBAC 与 ABAC

围绕 L8-identity 说明一个可验证的工程做法。

对应知识点:L8-identity

练习 3 / 4 · v1.0.0

coding · 身份、RBAC 与 ABAC

围绕 L8-identity 说明一个可验证的工程做法。

对应知识点:L8-identity

练习 4 / 4 · v1.0.0

scenario · 身份、RBAC 与 ABAC

围绕 L8-identity 说明一个可验证的工程做法。

对应知识点:L8-identity

图片查看器
100%

文章配图 · 按 Esc 关闭