繁体   English   中英

插入phoenix控制器

[英]plug in phoenix controller

我正在为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 %>

事实证明,在不需要身份验证的页面操作中,即使用户被授权,我仍然得到用户的授权。 我怎么解决这个问题?

我将代码分为两个步骤-首先尝试对用户进行身份验证,从数据库中加载并分配给连接-您始终可以运行此代码,并只需分配nil ,特殊的来宾用户或不分配任何内容(无论您喜欢什么)。 第二个方法是根据连接中的分配强制对用户进行身份验证-该操作仅在您需要的地方运行-就像您当前拥有的插头一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM