2015-07-20 19 views
5

Tôi đang xây dựng một ứng dụng Phoenix có xác thực. Trong bộ định tuyến của tôi, tôi có một cái gì đó như:Làm cách nào để bỏ qua một plug cho một trang cụ thể

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 

Tôi muốn bỏ qua Authenticate plug for/login, tôi có thể làm điều này trong bộ định tuyến hoặc tôi phải làm điều này trong chính Plug?

Plugs.Authenticate trông giống như:

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

Trả lời

13

Một cách để làm điều này là để xác định một đường ống riêng biệt:

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 

Có một vài điều cần lưu ý ở đây.

1) Các đường ống đang bị xích trong ví dụ khi yêu cầu xác thực.

2) Bạn có thể sử dụng cùng một phạm vi nhiều lần miễn là con đường thực tế là khác biệt này là bởi vì các tuyến đường trên biên dịch xấp xỉ tới:

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

Bạn có thể đọc thêm về cách các macro ở Phoenix tuyến làm việc hướng tới cuối trang trình bày tại http://www.chrismccord.com/blog/2014/03/13/write-less-do-more-and-have-fun-with-elixir-macros/

Các vấn đề liên quan