6

認証を使用して Phoenix アプリを構築しています。私のルーターには次のようなものがあります:

pipeline :browser do
    plug :accepts, ["html"]
    plug MyApp.Plugs.Authenticate
end

scope "/", MyApp do
    pipe_through :browser # Use the default browser stack

    get "/", HomeController, :show
    get "/login", SessionsController, :login
    get "/matches", MatchesController, :index
end

/login の認証プラグインをスキップしたいのですが、ルーターでこれを行うことができますか、それともプラグ自体で行う必要がありますか?

Plugs.Authenticate は次のようになります。

def call(conn, _) do
    case Authenticator.find_user(conn) do
        {:ok, user} ->
            assign(conn, :user, user)
        :error ->
            conn
                |> redirect(to: "/login")
                |> halt
    end
end
4

1 に答える 1

14

これを行う 1 つの方法は、別のパイプラインを定義することです。

pipeline :browser do
    plug :accepts, ["html"]
end

pipeline :auth do
    plug MyApp.Plugs.Authenticate
end

scope "/", MyApp do
    pipe_through [:browser, :auth]

    get "/", HomeController, :show
    get "/matches", MatchesController, :index
end

scope "/", MyApp do
    pipe_through :browser

    get "/login", SessionsController, :login
end

ここで注意すべき点がいくつかあります。

1) 認証が必要な例では、パイプラインがチェーンされています。

2)実際のルートが異なる限り、同じスコープを複数回使用できます。これは、上記のルートが大まかに次のようにコンパイルされるためです。

defmodule MyRouter do
  def match(conn, :get,    ["/"])
  def match(conn, :get,    ["/matches"])
  def match(conn, :get,    ["/login"])
end

Phoenix ルーティングのマクロがどのように機能するかについては、スライドの最後にあるhttp://www.chrismccord.com/blog/2014/03/13/write-less-do-more-and-have-funで詳しく読むことができます。 -with-elixir-macros/

于 2015-07-20T12:54:37.627 に答える