gpt4 book ai didi

elixir - Graphql Absinthe Elixir 基于权限的可访问字段

转载 作者:行者123 更新时间:2023-12-02 02:49:53 26 4
gpt4 key购买 nike

定义并非所有用户都可以访问的字段的正确方法是什么。

例如,普通用户可以查询用户并找到其他用户的句柄,但只有管理员用户才能找到他们的电子邮件地址。用户类型将其定义为字段,但可能无法访问。是否应该有一个单独的类型供普通用户可以看到?你会如何定义它?

抱歉,如果这不是那么清楚,我只是不具备词汇量。

最佳答案

编辑: 警告: Graphql documentation不同意这种做法。谨慎使用。无论您在哪里需要私有(private)字段,都必须包含适当的中间件。

使用absinthe middleware .

这里是一些如何做到这一点的代码。在此示例中,经过身份验证的用户可以看到电子邮件地址。匿名用户不能。您可以调整逻辑以要求您想要的任何权限。

defmodule MySite.Middleware.RequireAuthenticated do
@behaviour Absinthe.Middleware

@moduledoc """
Middleware to require authenticated user
"""

def call(resolution, config) do
case resolution.context do
%{current_user: _} ->
resolution
_ ->
Absinthe.Resolution.put_result(resolution, {:error, "unauthenticated"})
end
end
end

然后定义你的对象:

  object :user do
field :id, :id
field :username, :string
field :email, :string do
middleware MySite.Middleware.RequireAuthenticated
middleware Absinthe.Middleware.MapGet, :email
end
end

因此我们的现场电子邮件受到 RequireAuthenticated 中间件的保护。但根据上面的链接

One use of middleware/3 is setting the default middleware on a field, replacing the default_resolver macro.

在现场使用 middleware/2 宏也会发生这种情况。这就是为什么我们还需要添加

  middleware Absinthe.Middleware.MapGet, :email

查看现场中间件列表。

最后当我们执行查询时

query {
user(id: 1){
username
email
id
}
}

我们收到的响应中填充了开放字段,并取消了 protected 字段

{
"errors": [
{
"message": "In field \"email\": unauthenticated",
"locations": [
{
"line": 4,
"column": 0
}
]
}
],
"data": {
"user": {
"username": "MyAwesomeUsername",
"id": "1",
"email": null
}
}
}

您还可以使用 middleware/3 回调,这样您的对象就不会变得太冗长

  def middleware(middleware, %{identifier: :email} = field, _object) do
[MySite.Middleware.RequireAuthenticated] ++
[{Absinthe.Middleware.MapGet, :email}] ++
middleware
end

通过对 __using__/1 回调进行一些创造性的使用,您可以从主架构文件中获取一堆此类函数。

关于elixir - Graphql Absinthe Elixir 基于权限的可访问字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45236033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com