用途:处理 Spree 6 中“谁能登录、能做什么”的问题,覆盖员工角色与权限键、密钥作用域、客户所有权、登录策略与 OIDC 单点登录。
主要能力:Spree 6 有三类主体。员工用 POST /api/v3/admin/auth/login 返回的 JWT(aud: admin_api)认证,由当前店铺角色的权限键授权;集成方用 X-Spree-Api-Key 中的 sk_… 密钥,由密钥作用域授权;客户用 pk_… 加可选 JWT(aud: store_api),按所有权授权。权限键形如 read_<resource>/write_<resource>,write_x 隐含 read_x。角色是数据,属于某个资源(店铺或卖家),权限为 JSON 数组;每个店铺有一个受保护的 admin 角色,不可改名、编辑或删除。
使用方式:可在后台 Settings → Roles 管理,或用 Admin API /api/v3/admin/roles、/api/v3/admin/permissions(需 read_staff/write_staff),也可用 spree api post /roles 或 adminClient.roles.create。邀请员工用 Settings → Users → Invite 或 adminClient.invitations.create({ email, role_id }),role_id 必填。密钥用 spree api-key create --type secret --scopes read_orders,write_fulfillments 创建,作用域创建后不可改。扩展可调用 Spree.permissions.register_scope(:reviews, group: :catalog, resources: -> { [...] }),并在控制器声明 scoped_resource :reviews。
适用场景:后台员工权限划分、服务端集成密钥最小授权、客户数据所有权控制、员工 SSO(内置 OIDC 策略支持 Entra ID、Okta、Google Workspace、Keycloak、Auth0)及自定义认证策略。
限制:密钥只控制记录种类而非具体行,行级范围由控制器查询决定;记录状态规则应放在模型或工作流。Admin API 控制器未声明 scoped_resource 或 skip_scope_check! 会报 MissingScopedResource 并默认拒绝。自定义 ability 不能绕过权限键门禁,密钥不经过 ability。客户不使用 CanCanCan,越权抛 Spree::Storefront::AccessDenied。员工账号不会自动创建。具体价格与平台支持暂未提供。