【发布时间】:2017-01-13 02:14:28
【问题描述】:
我正在为 Phoenix Elixir 应用编写身份验证。我的 Browser Pipeline 中有一个 Plug,用于检查会话中的 user_id。如果存在,我将 User 添加到 conn:
router.ex
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
plug :put_secure_browser_headers
plug AccountMgr.Plugs.CheckSessionForUser
end
check_for_user_on_session.ex
def call(conn, _opts) do
user_id = get_session(conn, :user_id)
cond do
user = user_id && Repo.get(User, user_id) ->
assign(conn, :current_user, user)
true ->
assign(conn, :current_user, nil)
end
end
在我的 Login 函数中,如果凭据正确,我会将 user_id 添加到会话中:
cond do
user && checkpw(password, user.password_hash) ->
conn
|> assign(:user, user)
|> put_session(:user_id, user.id)
|> configure_session(renew: true)
|> redirect(to: portfolio_path(conn, :index))
user ->
{:error, :unauthorised, conn}
true ->
dummy_checkpw()
{:error, :not_found, conn}
end
在我的注销功能中,我正在调用configure_session (conn, drop: true)。
def logout(conn, _params) do
configure_session(conn, drop: true)
redirect(conn, to: authentication_path(conn, :index))
end
我使用IO.puts 在调用configure_session 函数之前和之后的会话中显示user_id,并且user_id 仍然存在。
我还将 user_id 记录在 check_for_user_on_session.ex Plug 中,它还显示在从注销功能重定向后调用它时存在的 user_id。
我不确定我错过了什么,但我希望会话 cookie 会在注销功能后被销毁,并为通过路由器和浏览器管道的下一页加载创建一个新的/p>
提前致谢
【问题讨论】:
-
当您说您使用
IO.puts来显示user_id时,我认为您需要在下一个请求中检查它,而不是现在的请求 -
谢谢大卫,我已经在检查会话 user_id 的插件上记录了相同的信息(它在浏览器管道中)并且它存在用于重定向页面加载