我正在为 Phoenix Elixir 应用程序编写身份验证。我的浏览器管道中有 Plug ,用于检查会话中的user_id。如果存在,我将用户添加到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
在我的登录功能中,如果凭据正确,我会将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
函数之前和之后使用user_id
在会话中显示configure_session
并且user_id
仍然存在。
我还在check_for_user_on_session.ex Plug 中记录了user_id,并且还显示了在从注销功能重定向后调用user_id时的用户名。
我不确定我缺少什么,但我希望会话cookie在注销功能之后被销毁,并且为下一页创建的新会话cookie通过路由器加载浏览器管道 < / p>
提前致谢
答案 0 :(得分:6)
logout
函数中有错误。它应该是:
def logout(conn, _params) do
configure_session(conn, drop: true)
|> redirect(to: authentication_path(conn, :index))
end
在您编写的logout
函数中,您正在调用configure_session
,但之后您没有使用返回值,因此删除会话的指令未传递给redirect
调用