我正在为Phoenix Elixir应用程序编写身份验证.我有一个插件我的浏览器管道,检查会话中的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
在我的Logout功能中,我正在打电话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 插件中记录了user_id,它还显示了在从logout函数重定向后调用user_id时存在的user_id.
我不确定我错过了什么,但我希望会话cookie在注销功能之后被销毁,并且为下一页创建的新会话cookie通过路由器和浏览器管道加载
提前致谢
该logout
函数有错误.它应该是:
def logout(conn, _params) do configure_session(conn, drop: true) |> redirect(to: authentication_path(conn, :index)) end
在logout
您编写的函数中,您正在调用,configure_session
但之后您没有使用返回值,因此删除会话的指令未传递给redirect
调用.