gpt4 book ai didi

sql - 如果我要保留密码重置日志,我需要哪些表

转载 作者:搜寻专家 更新时间:2023-10-30 20:28:18 24 4
gpt4 key购买 nike

我真的是数据库设计的新手,如果您能就如何构建用于保存密码重置日志的表提供一些指导,我将不胜感激。搜索了一下,我发现了这个:

table user
-------------
id integer primary key auto_increment
username varchar
salt_passhash varchar
......

table tokenreset
---------------
id integer primary key auto_increment
user_id integer
when_requested timestamp
all_done boolean default false

但我仍然不确定是否只有这两个表就足够了,假设我想知道:

  • 密码是什么时候重置的?

  • 邮件是什么时候发送的?

  • 用户请求重设密码的次数等

我应该将所有这些字段都放在 tokenreset 表中吗???

非常欢迎任何建议或想法

最佳答案

你可以做

用户

id | name | salt | password | email

密码重置请求

id | user_id | requested_on

密码重置邮箱

id | password_reset_request_id | email_log_id

密码重置日志

id | user_id | old_salt | old_password | reset_on

电子邮件日志

id | address_to | address_from | body

这还允许您实现诸如“在 m 天/n 次更改内不能使用相同的密码”之类的事情。

供评论:这可能在用户定义的函数中实现为

create function dbo.ValidatePassword
( @user_id int, @new_password varchar(100) )
returns bit
as
begin
declare @now datetime = getdate()
declare @i int

-- check password not repeated within the last 90 days
select @i = case when not exists(
select 1
from password_reset_log
where user_id = @user_id
and datediff(d, reset_on, @now) > 90
and old_password = HASHBYTES('SHA1', old_salt+@new_password)
)
then 1 else 0 end

-- check the password has been changed 5 times or more since it was last used
select @i = case when ( select count(1)
from password_reset_log
join (select user_id, MAX(reset_on) reset_on
from password_reset_log
where user_id = @user_id
and old_password = HASHBYTES('SHA1', old_salt+@new_password)
group by user_id
) last_used
on last_used.user_id = password_reset_log.user_id
and last_used.reset_on < password_reset_log.reset_on ) >= 5
then 1 else 0 end * @i

return @i
end

关于sql - 如果我要保留密码重置日志,我需要哪些表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19712010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com