插上凤凰控制器

时间:2016-10-23 20:13:52

标签: elixir phoenix-framework

我正在为Phoenix框架编写一个示例应用程序。 我的authenticate.ex:

defmodule Myapp.Plug.Authenticate do
  import Plug.Conn
  import Myapp.Router.Helpers
  import Phoenix.Controller

  def init(default), do: default

  def call(conn, default) do
    current_user = get_session(conn, :current_user)
    if current_user do
      assign(conn, :current_user, current_user)
    else
      conn
        |> put_flash(:error, 'You need to be signed in to view this page')
        |> redirect(to: session_path(conn, :new))
    end
  end
end

有一个控制器,我不需要对单个操作进行身份验证:

defmodule Myapp.SharedLinkController do
  use Myapp.Web, :controller
  alias Myapp.SharedLink

  plug Myapp.Plug.Authenticate when action in [:new, :create]

...

end

它有效,但问题是菜单显示取决于用户是否被授权:

<%= if Map.has_key?(@conn.assigns, :current_user) do %>
  <li>first</li>
<% else %>
  <li>second</li>
<% end %>

并且事实证明,在我不需要身份验证的页面操作上,即使授权用户,我也认为用户未经授权。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我会分两步拆分代码 - 首先尝试对用户进行身份验证,从数据库加载并分配给连接 - 您始终可以运行此代码,只需指定nil,特殊的访客用户或没什么,不管你喜欢什么。第二个是强制执行用户根据连接中的分配进行身份验证 - 这个只在您需要的地方运行 - 就像您当前拥有的插件一样。