Phoenix 1.8 一个非常重要的稳定主线,就是 Scopes。
它的意义不是“多了个概念”,而是把“当前请求到底代表谁、能看什么、能操作什么”这件事,从零散判断提升成了正式的安全结构。
你可以把 Scope 理解成:
一张在城内流转的通行证
上面写着:
- 当前是谁
- 属于哪个组织
- 允许进入哪些街区
- 生成资源时该自动绑到谁名下Phoenix 官方文档对 Scopes 的定位非常明确:
它和访问控制、安全边界、生成器行为直接相关。
典型 Scope 模块大概会是这样:
defmodule City.Accounts.Scope do
alias City.Accounts.User
defstruct user: nil
def for_user(%User{} = user) do
%__MODULE__{user: user}
end
end然后在请求进入时挂到 conn.assigns 或 socket.assigns 上。
于是你的 Context API 就可以统一写成:
Dispatch.list_dispatches(scope)
Dispatch.create_dispatch(scope, attrs)
Dispatch.close_dispatch(scope, dispatch)而不是:
Dispatch.list_dispatches(user, org_id, role, ip, ...)这就是 Phoenix 风格的成熟感:
不是把权限判断写得到处都是,而是让权限边界变成正式传递的数据结构。