如何跳过特定页面的插件
How do I skip a plug for an specific page
我正在构建一个带有身份验证的 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
一种方法是定义一个单独的管道:
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
您可以在 http://www.chrismccord.com/blog/2014/03/13/write-less-do-more-and-have-fun-with-elixir-macros/
中阅读有关 Phoenix 路由中的宏在幻灯片末尾如何工作的更多信息
我正在构建一个带有身份验证的 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
一种方法是定义一个单独的管道:
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
您可以在 http://www.chrismccord.com/blog/2014/03/13/write-less-do-more-and-have-fun-with-elixir-macros/
中阅读有关 Phoenix 路由中的宏在幻灯片末尾如何工作的更多信息