C#如何实现用户每日仅可修改一次密码的功能?
实现每日仅允许修改一次密码的方案
嘿,要搞定这个每日改密码的限制,咱们得从数据库存储修改记录和代码逻辑校验两部分下手,下面是具体的实现步骤和代码调整:
1. 先调整数据库结构
首先得在数据库里存下用户改密码的时间,有两种实用方案:
方案A:给现有User表加字段
直接在你的User表里新增一个last_password_change_date字段(类型选datetime或者date都行),专门用来存用户最近一次改密码的时间。
方案B:建独立的密码修改日志表
要是你想保留所有改密码的历史记录,可以新建一张PasswordChangeLog表,至少包含这些字段:
log_id(主键,自增)userName(关联User表的用户名)change_date(修改时间,datetime类型)
2. 修改代码逻辑(以方案A为例)
咱们要在原有的改密码流程前,先加一步“今日是否已修改过”的校验,同时还得把原代码里的SQL注入问题给补上(原代码用字符串拼接SQL太危险了!),调整后的代码如下:
// 先校验新密码和确认密码是否一致 if (txtNewPassword.Text == txtConfirmPassword.Text) { // 第一步:检查用户今天有没有改过密码 string checkChangeLogSql = "SELECT COUNT(*) FROM User WHERE userName = @UserName AND CONVERT(date, last_password_change_date) = CONVERT(date, GETDATE())"; // 用参数化查询杜绝SQL注入,一定要这么写! SqlParameter[] checkParams = new SqlParameter[] { new SqlParameter("@UserName", txtUserName.Text) }; int changeCount = Convert.ToInt32(mDBHelper.ExecuteScalar(checkChangeLogSql, checkParams)); if (changeCount > 0) { MessageBox.Show("您今天已经修改过密码啦,每日只能改一次哦!"); return; } // 第二步:校验原密码是否正确(原逻辑保留,同样改成参数化) string verifyUserSql = "SELECT * FROM User WHERE userName = @UserName AND password = @OldPassword"; SqlParameter[] verifyParams = new SqlParameter[] { new SqlParameter("@UserName", txtUserName.Text), new SqlParameter("@OldPassword", txtPassword.Text) }; mDT_Save = mDBHelper.GetTable(verifyUserSql, verifyParams); if (mDT_Save.Rows.Count > 0) { // 第三步:更新密码+记录修改时间 string updatePasswordSql = "UPDATE User SET password = @NewPassword, last_password_change_date = GETDATE() WHERE userName = @UserName"; SqlParameter[] updateParams = new SqlParameter[] { new SqlParameter("@NewPassword", txtConfirmPassword.Text), new SqlParameter("@UserName", txtUserName.Text) }; mDBHelper.ExecuteSQLNonQuery(updatePasswordSql, updateParams); MessageBox.Show("Password Changed Successfully"); txtPassword.Text = txtConfirmPassword.Text; return; } else { MessageBox.Show("User Not Found or Old Password Incorrect"); return; } } else { MessageBox.Show("New Password and Confirm Password do not match!"); }
3. 几个重要提醒
- 必须用参数化查询:原代码直接拼接SQL字符串,很容易被SQL注入攻击,上面的代码已经改成了参数化,一定要坚持用这种方式!
- 时间适配不同数据库:如果你的数据库不是SQL Server,比如用MySQL,那日期转换的函数得换成
DATE(NOW()),对应调整SQL里的日期判断部分。 - 处理历史用户数据:要是给已有的User表加
last_password_change_date字段,记得给老用户设置一个早于今天的默认值(比如'1900-01-01'),不然他们第一次改密码会被限制。
要是你选方案B(独立日志表),校验逻辑就改成查PasswordChangeLog里今天该用户的记录数,改完密码后往日志表里插一条新记录就行,核心逻辑和上面是一样的。
内容的提问来源于stack exchange,提问作者user7261203
相关产品推荐
相关产品推荐

