即使 current_user 为 nil,Guardian 让用户访问控制器?
Guardian let the user to get to the controller even when current_user is nil?
如果用户发送了一个未过期的令牌,但该特定用户已不存在,Guardian
仍然让用户访问控制器。
我在 current_user.ex
中添加了 {:ok, nil}
,它只是终止了连接,我认为这不是正确的方法,因为我需要像错误一样向用户反馈一些东西。我不确定我应该在那里使用什么?
这是我的路由器:
pipeline :authed_api do
plug :accepts, ["json"]
plug Guardian.Plug.VerifyHeader, realm: "Bearer"
plug Guardian.Plug.EnsureAuthenticated, handler: Web.GuardianErrorHandler
plug Guardian.Plug.LoadResource
plug Web.CurrentUser, handler: Web.GuardianErrorHandler
end
scope "/api/v1", Web do
pipe_through :authed_api
get "/logout", UserController, :logout
resources "/users", UserController
get "/*get", ErrorController, :handle_redirect
end
这是我的current_user
defmodule Web.CurrentUser do
import Plug.Conn
import Guardian.Plug
import Web.GuardianSerializer
def init(opts), do: opts
def call(conn, _opts) do
current_token = Guardian.Plug.current_token(conn)
case Guardian.decode_and_verify(current_token) do
{:ok, claims} ->
case Web.GuardianSerializer.from_token(claims["sub"]) do
{:ok, nil} ->
conn = Plug.Conn.halt(conn) # <-this line, I was referring to
{:ok, user} ->
Plug.Conn.assign(conn, :current_user, user)
{:error, _reason} ->
conn
end
{:error, _reason} ->
conn
end
end
end
提前致谢。
and it simply kill the connection
这是因为您只在 conn
上调用 halt
。您需要在停止之前发送响应。以下是发送带有文本 "Forbidden":
的 403 Forbidden 响应的方法
{:ok, nil} ->
conn |> send_resp(403, "Forbidden") |> Plug.Conn.halt()
如果用户发送了一个未过期的令牌,但该特定用户已不存在,Guardian
仍然让用户访问控制器。
我在 current_user.ex
中添加了 {:ok, nil}
,它只是终止了连接,我认为这不是正确的方法,因为我需要像错误一样向用户反馈一些东西。我不确定我应该在那里使用什么?
这是我的路由器:
pipeline :authed_api do
plug :accepts, ["json"]
plug Guardian.Plug.VerifyHeader, realm: "Bearer"
plug Guardian.Plug.EnsureAuthenticated, handler: Web.GuardianErrorHandler
plug Guardian.Plug.LoadResource
plug Web.CurrentUser, handler: Web.GuardianErrorHandler
end
scope "/api/v1", Web do
pipe_through :authed_api
get "/logout", UserController, :logout
resources "/users", UserController
get "/*get", ErrorController, :handle_redirect
end
这是我的current_user
defmodule Web.CurrentUser do
import Plug.Conn
import Guardian.Plug
import Web.GuardianSerializer
def init(opts), do: opts
def call(conn, _opts) do
current_token = Guardian.Plug.current_token(conn)
case Guardian.decode_and_verify(current_token) do
{:ok, claims} ->
case Web.GuardianSerializer.from_token(claims["sub"]) do
{:ok, nil} ->
conn = Plug.Conn.halt(conn) # <-this line, I was referring to
{:ok, user} ->
Plug.Conn.assign(conn, :current_user, user)
{:error, _reason} ->
conn
end
{:error, _reason} ->
conn
end
end
end
提前致谢。
and it simply kill the connection
这是因为您只在 conn
上调用 halt
。您需要在停止之前发送响应。以下是发送带有文本 "Forbidden":
{:ok, nil} ->
conn |> send_resp(403, "Forbidden") |> Plug.Conn.halt()