在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
在数据库中的用户行上更新 key
和 time
(为此需要 2 列)
创建包含链接但仅包含KEY
的电子邮件地址是不必要的,并且可能会被嗅探,从而破坏此过程。
<a href='".base_url()."user/reset_pass/$key'>
用户点击他们收到的电子邮件上的链接
运行用户控制器的 reset_pass 方法并将密钥作为参数传递 在用户表中搜索键如果没有找到
将用户扔到某个地方,可能是 hack如果找到但超过时限
使用新密钥生成另一封电子邮件 使用新的key
和time
更新用户表
如果找到并且时间在限制范围内
向用户抛出重置密码视图密码重置后
将用户表集key
和time
列更新为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中忘记密码的主要内容,如果未能解决你的问题,请参考以下文章