2015-07-20 11 views
5

Ich baue eine Phoenix App mit Authentifizierung. In meinem Router habe ich so etwas wie:Wie überspringe ich einen Stecker für eine bestimmte Seite

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 

Ich möchte das Authentifizieren Stecker für/login überspringen, kann ich dies in dem Router oder mache ich das selbst im Plug tun?

Plugs.Authenticate wie folgt aussieht:

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

Antwort

13

Eine Möglichkeit, dies zu tun, ist eine separate Pipeline zu definieren:

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 

Es gibt ein paar Dinge zu beachten.

1) Die Pipelines werden in dem Beispiel verkettet, in dem eine Authentifizierung erforderlich ist.

2) Sie können die gleichen Umfang mehrfach verwenden, solange die tatsächliche Strecke unterscheidet sich dies, weil die oben genannten Strecken kompilieren etwa:

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

Sie mehr darüber, wie die Makros in Phoenix Routing lesen Arbeiten Sie gegen Ende der Folien bei http://www.chrismccord.com/blog/2014/03/13/write-less-do-more-and-have-fun-with-elixir-macros/

Verwandte Themen