凤凰会议未被删除

时间:2017-01-13 02:14:28

标签: elixir phoenix-framework

我正在为 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>

提前致谢

1 个答案:

答案 0 :(得分:6)

logout函数中有错误。它应该是:

def logout(conn, _params) do
    configure_session(conn, drop: true)
    |> redirect(to: authentication_path(conn, :index))
end

在您编写的logout函数中,您正在调用configure_session,但之后您没有使用返回值,因此删除会话的指令未传递给redirect调用