You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Absinthe自定义认证中间件未在查询请求时触发运行问题咨询

问题原因解答

你当前的中间件未触发的核心原因是 import_fields 操作会将:student_queries对象下的所有字段迁移到根query对象下,这些字段的所属对象标识符从:student_queries变成了内置的:query,你定义的全局middleware/3回调匹配的是:student_queries标识符,自然无法命中,不会注入鉴权中间件。

关于middleware回调匹配规则的解答

Absinthe的middleware/3回调支持匹配任意合法的对象标识符,既可以匹配:query、:mutation这类内置的根操作对象标识符,也可以匹配你自定义的普通对象、输入对象的标识符,匹配规则没有特殊限制。

分组鉴权的最优实现方案

你当前的实现方式不是最优方案,推荐优先选择以下两种更稳定、更直观的实现:

  • 方案1:直接在自定义对象内声明中间件
    在定义:student_queries对象时,直接在对象作用域内注入中间件,后续无论你将这个对象的字段导入到哪个根操作下,中间件都会自动生效:
defmodule CliftonWeb.Schema.Types do
  use Absinthe.Schema.Notation

  object :student_queries do
    # 直接在对象内添加中间件,所有字段自动继承
    middleware CliftonWeb.Middlewares.CheckAuth

    # 你的字段定义
    field :student_info, :student do
      # resolver等配置
    end
  end
end

配置完成后你可以直接删除Schema中自定义的middleware/3回调逻辑即可。

  • 方案2:基于元数据标记匹配的全局中间件注入
    如果你需要更灵活的鉴权粒度(部分字段鉴权、部分不鉴权),可以给需要鉴权的字段添加元数据标记,全局中间件回调匹配标记即可:
# 字段定义时添加meta标记
field :student_info, :student do
  meta :auth_required, true
  # 其他配置
end

# Schema中全局middleware回调
def middleware(middleware, field, _object) do
  if field.meta[:auth_required] do
    [CliftonWeb.Middlewares.CheckAuth | middleware]
  else
    middleware
  end
end

这种方案支持跨对象的灵活鉴权配置,不需要绑定特定对象的标识符。

内容的提问来源于stack exchange,提问作者Tom Haines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:45:06