对于初学者来说,我目前正在设置
Plug.Session
如下:
plug Plug.Session,
store: :cookie,
key: "_key",
signing_salt: "SALT_HERE"
当用户注销时,他们点击:
def logout(conn, _) do
conn
|> configure_session(drop: true)
|> redirect(to: "/login")
end
所有登录/注销功能均有效,并且登录表单上会生成新的
_key
。我遇到的问题是,如果我在登录时复制 _key
的值,并在注销时通过 Chrome 调试器替换浏览器中的 cookie 值,我可以导航到无需登录即可直接获取 URL,然后可以像登录一样访问所有内容。
有什么好的方法可以解决这个问题吗?我意识到,在某人再次登录并生成新值之前获取登录者的
_key
值并使用它是非常困难的,但在浏览了一下之后,我找不到任何有关此的信息。
解决这个问题的方法是将会话存储从 cookie 移至服务器端。当您拥有
store: :cookie
时,所有会话信息都存储在用户计算机上的 cookie 中。它使用服务器上的密钥进行加密。那个 |> configure_session(drop: true)
只是清除该用户的 cookie。如果您在服务器端将会话存储更改为 ets 或 redis,则用户的 cookie 只包含引用服务器上存储的会话数据的密钥,从而使您可以完全控制使会话失效。
可以帮助您完成此操作的示例包:https://github.com/thoughtbot/redbird
我也遇到同样的问题。我可以知道你是怎么解决这个问题的吗?