在codeigniter中忘记密码

Posted

技术标签:

【中文标题】在codeigniter中忘记密码【英文标题】:Forgot password in codeigniter 【发布时间】:2015-10-29 10:44:43 【问题描述】:

我需要在登录页面实现忘记密码。首先我验证电子邮件,然后生成一个字符串,然后将带有密钥的链接和电子邮件发送到特定邮件。

我知道如何重置,但是收到了该邮件的链接

$message= "<a href='".base_url()."user/reset_pass/$key/$email'>";

这是我提供的链接。

【问题讨论】:

您可以使用konyukhov.com/soft/tank_auth 身份验证库的最佳解决方案。它将帮助您减少工作量。它具有注册、登录、重置和忘记密码功能。易于实施 非常感谢大家 【参考方案1】:

我不会尝试将电子邮件地址作为重置密码的获取方法。 您只需将哈希键作为 url 发送并完成您的工作。这些散列密钥将作为令牌数据进行验证,在有限的时间内有效。而已 。

【讨论】:

【参考方案2】:

基本流程应该是这样的:

用户点击忘记密码 验证电子邮件或用户 ID 是否存在于数据库中 创建key 在数据库中的用户行上更新 keytime(为此需要 2 列)

创建包含链接但仅包含KEY 的电子邮件地址是不必要的,并且可能会被嗅探,从而破坏此过程。

&lt;a href='".base_url()."user/reset_pass/$key'&gt;

用户点击他们收到的电子邮件上的链接

运行用户控制器的 reset_pass 方法并将密钥作为参数传递 在用户表中搜索键

如果没有找到

将用户扔到某个地方,可能是 hack

如果找到但超过时限

使用新密钥生成另一封电子邮件 使用新的keytime 更新用户表

如果找到并且时间在限制范围内

向用户抛出重置密码视图

密码重置后

将用户表集keytime 列更新为NULL

【讨论】:

我使用 codeigniter 已经有一段时间了,但看起来不错。好吧,您可以在该方法中使用它,而不是作为该方法的参数。 If all else fails Read the Manual【参考方案3】:

首先你需要检查用户点击忘记密码时会话是否存在。 如果否,则设置您将从用户那里获取的电子邮件的验证方法。

像这样:

$this->form_validation->set_rules('email', 'Email', 'required|valid_email|callback_email_exists');

email_exists 方法中,使用给定的电子邮件ID检查用户是否存在。

如果用户存在则创建一个邮件功能。在消息中发送链接重置密码。

$slug = md5($user->user_id . $user->email . date('Ymd'));
    $this->email->message('To reset your password please click the link below and follow the instructions:

'. site_url('forgotpassword/reset/'.$user->user_id .'/'. $slug) .'
If you did not request to reset your password then please just ignore this email and no changes will occur.
Note: This reset code will expire after '. date('j M Y') .'.');

然后发送邮件。

当用户点击重置链接时,该方法将再次检查会话。如果会话存在,则重定向到主页,否则从 url 获取第三和第四段。

$user_id = $this->uri->segment(3);
if(!$user_id) show_error('Invalid reset code.');
$hash = $this->uri->segment(4);
if(!$hash) show_error('Invalid reset code.');

从 url 中获取用户 ID。再次从 db 值中生成 $slug 并将其与 url $slug 进行比较。如果两者都匹配,则向用户提供带有密码的重置字段并确认密码。

如果两个密码都匹配,请更新密码。

【讨论】:

函数 reset_pass($key,$email) $key=$this->uri->segment(3); $email=$this->uri->segment(4); 我在redirect redirect(base_url()."user/pass_confirmation/".$encrypted_string.'/'.$email);它在存在电子邮件的情况下无法正常工作 如果不使用 urlencode,您将无法在 url 中传递电子邮件。

以上是关于在codeigniter中忘记密码的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter - 忘记密码

忘记密码功能在 CodeIgniter 中不起作用

VMware CentOS7 忘记密码解决方法

win7下mysql服务器忘记密码怎么办

harbor密码丢失,忘记Harbor密码?

AppServ下的MySQL登录及忘记密码怎么办