全书目录

第三十八篇:Phoenix 完全指南 —— 实时频道城邦宇宙

第六章:Phoenix 1.8 的 Scopes,是城邦访问边界的通行证系统

1 分钟 313 字 第 725 / 962 个阅读单元

Phoenix 1.8 一个非常重要的稳定主线,就是 Scopes

它的意义不是“多了个概念”,而是把“当前请求到底代表谁、能看什么、能操作什么”这件事,从零散判断提升成了正式的安全结构。

你可以把 Scope 理解成:

text
一张在城内流转的通行证
上面写着:
- 当前是谁
- 属于哪个组织
- 允许进入哪些街区
- 生成资源时该自动绑到谁名下

Phoenix 官方文档对 Scopes 的定位非常明确:
它和访问控制、安全边界、生成器行为直接相关。

典型 Scope 模块大概会是这样:

elixir
defmodule City.Accounts.Scope do
  alias City.Accounts.User

  defstruct user: nil

  def for_user(%User{} = user) do
    %__MODULE__{user: user}
  end
end

然后在请求进入时挂到 conn.assignssocket.assigns 上。
于是你的 Context API 就可以统一写成:

elixir
Dispatch.list_dispatches(scope)
Dispatch.create_dispatch(scope, attrs)
Dispatch.close_dispatch(scope, dispatch)

而不是:

elixir
Dispatch.list_dispatches(user, org_id, role, ip, ...)

这就是 Phoenix 风格的成熟感:
不是把权限判断写得到处都是,而是让权限边界变成正式传递的数据结构。