[英]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.