2017-11-20 4 views
0

ユーザーが期限切れになっていなくても特定のユーザーが存在しなくなったトークンを送信した場合でも、Guardianはユーザーがコントローラにアクセスできるようにします。Guardianは、current_userがnilであってもコントローラにアクセスできるようにしますか?

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 

は、事前にありがとうございます。

答えて

1

、それは単にあなたがconnにちょうどhaltを呼び出しているので、これがある

接続を殺します。停止する前に応答を送信する必要があります。 「Forbidden」というテキストの403 Forbiddenレスポンスを送信する方法は次のとおりです。

{:ok, nil} -> 
    conn |> send_resp(403, "Forbidden") |> Plug.Conn.halt() 
関連する問題