我正在为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 %>
并且事实证明,在我不需要身份验证的页面操作上,即使授权用户,我也认为用户未经授权。我该如何解决这个问题?
答案 0 :(得分:1)
我会分两步拆分代码 - 首先尝试对用户进行身份验证,从数据库加载并分配给连接 - 您始终可以运行此代码,只需指定nil
,特殊的访客用户或没什么,不管你喜欢什么。第二个是强制执行用户根据连接中的分配进行身份验证 - 这个只在您需要的地方运行 - 就像您当前拥有的插件一样。