Phoenix Framework:尽管从数据库中成功获取,current_user仍然无法在视图中使用

时间:2018-06-16 20:27:58

标签: authorization elixir phoenix-framework

使用模块插件,我从数据库中获取当前用户信息,并将其作为current_user存储在Plug.Conn.assigns中。通过检查连接,我看到分配中的当前用户详细信息,但我无法访问任何详细信息。

例如,我想显示当前用户的名称,如“您以@conn.assigns.current_user.name登录”,但Phoenix显示当前用户为nil

请查看随附的屏幕截图。

enter image description here

Plug.Conn.assigns中肯定有一个current_user对象。我应该可以访问名称“cooldude77@aol.com”。那么,为什么凤凰告诉我current_user是nil?

修改 添加当前用户插件:

  def call(conn, _params) do
    if conn.assigns[:current_user] do
      conn
    else
      user_id = get_session(conn, :user_id)

      cond do
        user = Repo.get_by(User, auth_id: user_id) ->
          conn
          |> assign(:current_user, user)
          |> assign(:user_signed_in?, true)

        true ->
          conn
          |> assign(:current_user, nil)
          |> assign(:user_signed_in?, false)
      end
    end
  end

所以,我在这里使用Auth0进行身份验证。用户登录Auth0并重定向回应用程序,其中包含我跟踪的3个属性,唯一的auth_id,名称和头像。登录后,我通过检查他们的auth_id是否保存在我的数据库中来检查这是否是新用户,如果是,那么我知道他们是返回用户并且我将current_user对象分配给用户。如果他们是新用户,我将它们添加到我的数据库(给他们一些额外的属性)并将current_user对象分配给用户。

仍遇到此问题我在连接中有current_user但我无法访问用户的属性 - 它们显示为nil

2 个答案:

答案 0 :(得分:0)

您应该只需要在模板中使用@current_user.name即可吸引用户。

此外,由于没有人登录时插件中的current_user的值设置为nil,因此您可以执行!!@current_user而不是上面的@conn.assigns[:user_signed_in?]

答案 1 :(得分:0)

@Badu的假设使我发现了这个问题。在我的控制器代码中,我最初将current_user从会话传递给render函数,如下所示:

def index(conn, _params) do
render(conn, "index.html", current_user: get_session(conn, :current_user))
end

随着应用程序的增长和我添加更多页面,我不得不继续从会话中吸引当前用户,因此我决定用一个插件替换此行为,我在上面发布了代码。但是,我忘记了从控制器中删除存储在连接中的current_user对象。因此,尽管我的连接中确实存在一个current_user对象,但是我的view_template正在访问current_user的旧版本,该版本不具有相同的属性,因此值为nil。