什么是来自凤凰城/ Elixir的Rails的before_filter的替代品?

时间:2016-10-24 22:00:53

标签: rest elixir phoenix-framework

在我的凤凰应用程序中,我有一个管道和范围" api"

  pipeline :api do
    plug(:accepts, ["json"])
  end


  scope "/api" .....
    # .....
  end

如何通过通过特殊标头传递的API密钥来保护它?也就是说,我喜欢这样的事情:

defmodule MyApp.MyController do
  use MyApp.Web, :controller

  :before_filter :authenticate_user_by_api_key!


  def authenticate_user_by_api_key!(conn, params) do
    # check if a header exists and key is valid
  end
end

我计划验证标头。 如何在不依赖任何第三方库的情况下实现这一目标?

另外。如果我想使用模块而不是单个函数,我该怎么做?

1 个答案:

答案 0 :(得分:4)

本地插头

如果它是本地方法,您只需在控制器中使用plug构造即可。

defmodule MyApp.MyController do
  use MyApp.Web, :controller

  plug :authenticate_user_by_api_key!


  defp authenticate_user_by_api_key!(conn, params) do
    # Authenticate or something
  end
end

See this answer并详细了解Plugs here

模块插头

如果您想从模块调用该函数,您的模块必须导出init/1call/2方法:

defmodule MyApp.Plugs.Authentication do
  import Plug.Conn

  def init(default), do: default

  def call(conn, default) do
    # Check header for API Key
  end
end

在你的控制器中使用它:

defmodule MyApp.MyController do
  use MyApp.Web, :controller

  plug MyApp.Plugs.Authentication

  # Controller Methods
end

阅读Phoenix Guide on Module Plugs了解详情。