elixir - 如何跳过特定页面的插件

标签 elixir phoenix-framework

我正在构建带有身份验证的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的Authenticate插件,可以在路由器中执行此操作还是必须在Plug本身中执行此操作?

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路由中的宏如何工作的更多信息,直到幻灯片的结尾

关于elixir - 如何跳过特定页面的插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31516407/

相关文章:

elixir - 如何在一个命令中运行多个混合任务

tcp - phoenix 框架中的原始 tcp 连接

docker - 如何调试使用docker运行的phoenix应用程序?

mongodb - ChangeSet Ecto.Model Struct 的所有字段均为零

kubernetes - Phoenix channel 的套接字在分布式集群环境中不断关闭

pid - 将事件从 GenEvent 服务器转发到我在 elixir otp 中的进程

reactjs - 从 Phoenix 后端拆分单页应用程序代码?

elixir - 来自 elixir 脚本的非常基本的 IEx 和 IEx.pry 得到错误 : IEx shell running?

elixir - 无法在 Phoenix/Elixir 中渲染没有布局的错误 View

elixir - 如何编写在日期时间字段上执行 group_by MONTH 的 Ecto 查询