2015-07-20 8 views
5

Sto creando un'applicazione Phoenix con autenticazione. Nel mio router ho qualcosa di simile:Come saltare un plug-in per una pagina specifica

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 

voglio saltare l'Autentica spina per/login, posso fare questo nel router o devo farlo nella spina?

Plugs.Authenticate assomiglia:

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

risposta

13

Un modo per farlo è quello di definire una conduttura separata:

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 

Ci sono un paio di cose da notare qui.

1) Le condotte sono concatenate nell'esempio in cui è richiesta l'autenticazione.

2) È possibile utilizzare la stessa portata più volte fino a quando il percorso reale è distinta questo è perché le rotte sopra compilano grosso modo:

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

Si può leggere di più su come le macro a Phoenix instradamento lavorare verso la fine delle diapositive al http://www.chrismccord.com/blog/2014/03/13/write-less-do-more-and-have-fun-with-elixir-macros/

Problemi correlati