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

标签 sql database database-design

我对数据库设计非常陌生,如果您能就如何构建用于保存密码重置日志的表提供一些指导,我真的很感激。 搜索了一下,我发现了这个:

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/

相关文章:

sql - HSQLDB: "invalid datetime format"用于 dd/mm/yyyy 但不适用于 yyyy-mm-dd

php - 如何将一个产品插入多个类别 laravel attach()

sql-server - 在 SQL Server 中创建索引的最佳实践和反模式?

MySQL自动增量每条记录增加超过+1

mysql - SQL 连接重复结果

MySQL 计数出现但返回所有行

sql - 在 VB.NET 中使用系统表

sql - 使用模型关联查找

database - 垂直数据库中的投影

MySQL:删除同一行时发生死锁