如果我在控制器中本地使用插头。
例如:
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
会在任何方法之前被调用,对吗?
我需要允许或中止被调用方法的执行,我该怎么做?
答案 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