在本教程中,你将扩展 上一个教程中创建的聊天机器人,使其为每个用户提供他们自己的私密对话。你将添加 资源级访问控制,以便用户只能看到自己的对话线程。 授权流程:认证后,授权处理程序使用 owner=user id 标记每个资源并返回过滤器,使用户只能看到自己的对话线程。

前提条件

在开始本教程之前,请确保你正在运行 第一个教程中的机器人 且没有错误。

1. 添加资源授权

回想一下,在上一个教程中,Auth 对象让你注册一个 身份验证函数,LangSmith 用它来验证传入请求中的承载令牌。现在你将使用它来注册一个 授权 处理程序。 授权处理程序是在身份验证成功 之后 运行的函数。这些处理程序可以向资源添加 元数据(例如谁拥有它们)并过滤每个用户可以看到的内容。 更新你的 src/security/auth.py 文件,并添加一个授权处理程序来处理每个请求:
src/security/auth.py
该处理程序接收两个参数:
  1. ctx (AuthContext):包含当前 user 的信息、用户的 permissions、resource(“threads”、“crons”、“assistants”)以及正在执行的 action(“create”、“read”、“update”、“delete”、“search”、“create_run”)。
  2. value (dict):正在被创建或访问的数据。此字典的内容取决于被访问的资源和操作。有关如何获取更细粒度的访问控制,请参阅下面的 添加作用域授权处理程序。
请注意,这个简单的处理程序做了两件事:
  1. 将用户的 ID 添加到资源的元数据中。
  2. 返回一个元数据过滤器,使用户只能看到他们拥有的资源。

2. 测试私密对话

测试你的授权。如果你设置正确,你将看到所有 ✅ 消息。请确保你的开发服务器正在运行(运行 langgraph dev):
输出:
这意味着:
  1. 每个用户可以在自己的对话线程中创建和聊天。
  2. 用户无法看到彼此的对话线程。
  3. 列出对话线程时只显示自己的。

3. 添加作用域授权处理程序

宽泛的 @auth.on 处理程序匹配所有 授权事件。这很简洁,但它意味着 value 字典的内容没有明确定义作用域,并且相同的用户级访问控制应用于每个资源。如果你想要更细粒度的控制,也可以控制资源上的特定操作。 更新 src/security/auth.py 以添加针对特定资源类型的处理程序:
请注意,你现在不是拥有一个全局处理程序,而是拥有针对以下方面的特定处理程序:
  1. 创建线程
  2. 读取线程
  3. 访问助手
前三者匹配每个资源上的特定 操作(参见 资源操作),而后两者(@auth.on.assistants 和 @auth.on.store)匹配 assistants 和 store 资源上的 任何 操作。对于每个请求,LangGraph 将运行与正在访问的资源和操作最匹配的特定处理程序。这意味着上面的四个处理程序将运行,而不是宽泛作用域的 “@auth.on” 处理程序。 存储授权的工作方式与线程和助手不同。有关存储隔离模式和权衡,请参阅 按用户隔离存储。 尝试将以下测试代码添加到你的测试文件中:
输出:
恭喜!你已经构建了一个每个用户拥有自己私密对话的聊天机器人。虽然这个系统使用简单的基于令牌的身份验证,但这些授权模式适用于实现任何真实的身份验证系统。在下一个教程中,你将使用 OAuth2 用真实的用户账户替换你的测试用户。

下一步

现在你可以控制对资源的访问,你可能希望:
  1. 继续 连接身份验证提供商 以添加真实的用户账户。
  2. 阅读更多关于 授权模式 的信息。
  3. 查看 API 参考 以了解本教程中使用的接口和方法的详细信息。