如何在本地插件中中止执行?

时间:2017-07-04 10:29:48

标签: phoenix-framework

如果我在控制器中本地使用插头。

例如:

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

  plug :authenticate_user_by_api_key!

  def some_method(conn, params) do

  end

  defp authenticate_user_by_api_key!(conn, params) do
    # Authenticate 
    #How to permit execution or abort it?
  end
end

据我了解,authenticate_user_by_api_key会在任何方法之前被调用,对吗?

我需要允许或中止被调用方法的执行,我该怎么做?

1 个答案:

答案 0 :(得分:0)

  

据我了解,authenticate_user_by_api_key会在任何方法之前被调用,对吗?

  

我需要允许或中止被调用方法的执行,我该怎么做?

您可以使用Plug.Conn.halt/1暂停执行更多插件,包括最初由Phoenix Router调用的功能。对于有效的身份验证,您只需返回原始conn,即可继续执行。

(注意:插件功能的第二个参数是插件选项,不是凤凰城的params。要访问插件中的params,您可以使用conn.params。)

defp authenticate_user_by_api_key!(conn, opts) do
  if some_condition_which_is_true_for_valid_key do
    conn
  else
    # you'll generally want to respond with something before halting execution
    conn
    |> put_status(400)
    |> text("invalid api key")
    |> halt
  end
end