2017-11-20 5 views
0

Wenn ein Benutzer ein Token sendet, das nicht abgelaufen ist, aber dieser bestimmte Benutzer nicht mehr vorhanden ist, kann der Benutzer Guardian immer noch zum Controller gelangen.Guardian den Benutzer auf den Controller zu bekommen, auch wenn current_user ist null?

Ich habe hinzugefügt {:ok, nil} in current_user.ex und es einfach die Verbindung zu töten, die ich glaube nicht, ist der richtige Ansatz, da ich etwas zurück an den Benutzer wie ein Fehler zurückgeben muss. Ich bin mir nicht sicher, was soll ich dort benutzen?

Hier mein Router ist:

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 

Hier ist meine 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 

Vielen Dank im Voraus.

Antwort

1

und es töten einfach die Verbindung

Dies ist, weil Sie gerade halt auf dem conn aufrufen. Sie müssen eine Antwort senden, bevor Sie anhalten. So senden Sie eine 403 Verbotene Antwort mit dem Text "Verboten":

{:ok, nil} -> 
    conn |> send_resp(403, "Forbidden") |> Plug.Conn.halt() 
Verwandte Themen