Guardian позволяет пользователю получить доступ к контроллеру, даже если current_user равен nil?

Если пользователь отправляет токен, срок действия которого еще не истек, этого конкретного пользователя больше не существует, Guardian все еще позволяйте пользователю добраться до контроллера.

я добавил {:ok, nil} в current_user.ex и это просто убивает соединение, которое я не считаю правильным, поскольку мне нужно вернуть что-то пользователю, например, ошибку. Я не уверен, что я должен использовать там?

Вот мой роутер:

 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

Заранее спасибо.

1 ответ

Решение

и это просто убивает связь

Это потому что ты звонишь просто halt на conn, Вы должны отправить ответ, прежде чем остановиться. Вот как отправить 403 Запрещенный ответ с текстом "Запрещено":

{:ok, nil} ->
  conn |> send_resp(403, "Forbidden") |> Plug.Conn.halt()
Другие вопросы по тегам