如何使 Ecto Schema 中的值过期?
How to expire a value in an Ecto Schema?
假设有一个模式:
schema "players" do
:key, :string
:reset_key_token, :string
end
当用户想要重置他们的密钥时,在 :reset_key_token
字段中设置一个散列。这个想法是 :reset_key_token
应该放回 nil
说,一周后设置令牌。我的问题是:
是否有标准方法使 Ecto Schema 的值过期?
我已经找了一段时间了,但还没有找到关于这个主题的任何东西。但是,我发现 并想到遵循相同的想法:
1.- 添加一个 :reset_key_token_expires, Ecto.DateTime
到模式。
2.- 在读取之前(在我的例子中,我在写入之前也需要它),检查 :reset_key_token_expires
并将其设置为 nil
如果时间已经过去。
不过我想看看有没有做过的人先给个答案
感谢您的帮助!
你真的需要在到期后将值设置为nil
吗?对于这个用例,您只想防止令牌在过期后被使用,我只是将该值与处理重置密钥的控制器中的当前时间进行比较。这是一些代码:
def reset_key(conn, %{"username" => username, "reset_key_token" => reset_key_token}) do
user = Repo.get_by!(User, username: username)
if reset_key_token == user.reset_key_token do
case DateTime.compare(user.reset_key_token_expires, DateTime.utc_now) do
:gt ->
# token is still valid
_ ->
# token is expired
end
else
# token is invalid
end
end
假设有一个模式:
schema "players" do
:key, :string
:reset_key_token, :string
end
当用户想要重置他们的密钥时,在 :reset_key_token
字段中设置一个散列。这个想法是 :reset_key_token
应该放回 nil
说,一周后设置令牌。我的问题是:
是否有标准方法使 Ecto Schema 的值过期?
我已经找了一段时间了,但还没有找到关于这个主题的任何东西。但是,我发现
1.- 添加一个 :reset_key_token_expires, Ecto.DateTime
到模式。
2.- 在读取之前(在我的例子中,我在写入之前也需要它),检查 :reset_key_token_expires
并将其设置为 nil
如果时间已经过去。
不过我想看看有没有做过的人先给个答案
感谢您的帮助!
你真的需要在到期后将值设置为nil
吗?对于这个用例,您只想防止令牌在过期后被使用,我只是将该值与处理重置密钥的控制器中的当前时间进行比较。这是一些代码:
def reset_key(conn, %{"username" => username, "reset_key_token" => reset_key_token}) do
user = Repo.get_by!(User, username: username)
if reset_key_token == user.reset_key_token do
case DateTime.compare(user.reset_key_token_expires, DateTime.utc_now) do
:gt ->
# token is still valid
_ ->
# token is expired
end
else
# token is invalid
end
end