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
相关产品推荐
相关产品推荐

