【问题标题】:What is the reason updating a user's password fails in this Codeigniter 3 application?在此 Codeigniter 3 应用程序中更新用户密码失败的原因是什么?
【发布时间】:2021-02-28 17:12:33
【问题描述】:

我正在 Codeigniter 3.1.8 和 Bootstrap 4 中开发基本的 blog application

我在这个应用程序中添加了一个注册和登录系统。我目前正在研究密码重置系统。它有两个步骤:

  1. 生成令牌并将其插入数据库 (authors 表)。
  2. 设置新密码。

由于某种原因我无法找出并修复,设置新密码失败并出现 404 错误。

路线:

$route['default_controller'] = 'posts';
$route['install'] = 'install';
$route['migrate'] = 'migrate';
$route['register'] = 'register';
$route['login'] = 'login';
$route['passwordreset'] = 'passwordreset';
$route['newpasword'] = 'newpasword';
$route['newpasword/(:any)/(:any)'] = 'newpasword/index/$1/$2/';
$route['dashboard'] = 'dashboard';
$route['dashboard/create-post'] = 'dashboard/posts/create';
$route['dashboard/create-page'] = 'dashboard/pages/create';
$route['dashboard/create-category'] = 'dashboard/categories/create';
$route['dashboard/manage-authors'] = 'dashboard/users';
$route['404_override'] = '';
$route['categories/posts/(:any)'] = 'categories/posts/$1';
$route['(:any)'] = 'posts/post/$1';
$route['translate_uri_dashes'] = FALSE;

在 Newpasword 控制器中:

class Newpasword extends CI_Controller {

  private $hashed_email = '';
  private $token = '';

  public function index($hashed_email, $token) {
    $data = $this->Static_model->get_static_data();
    $data['pages'] = $this->Pages_model->get_pages();
    $data['tagline'] = 'New password';
    $data['categories'] = $this->Categories_model->get_categories();

    $this->hashed_email = $hashed_email;
    $this->token = $token;

    // Form validation rules
    $this->form_validation->set_rules('password', 'Password', 'required|min_length[6]');
    $this->form_validation->set_rules('cpassword', 'Confirm password', 'required|matches[password]');
    $this->form_validation->set_error_delimiters('<p class="error-message">', '</p>');

    if(!$this->form_validation->run()) {
        $this->load->view('partials/header', $data);
        $this->load->view('auth/newpassword');
        $this->load->view('partials/footer');
    } else {
        // Encrypt new password
      $enc_password = password_hash($this->input->post('password'), PASSWORD_DEFAULT);

      // Update password column
      $this->Usermodel->set_new_password($hashed_email, $token, $enc_password);
    }
  }
}

上述控制器对应的视图(newpassword.php):

<?php echo form_open(base_url('newpassword')); ?>
  <div class="form-group <?php if(form_error('password')) echo 'has-error';?>">
    <input type="password" name="password" id="password" class="form-control" placeholder="Password">
    <?php if(form_error('password')) echo form_error('password'); ?> 
  </div>
  <div class="form-group <?php if(form_error('cpassword')) echo 'has-error';?>">
    <input type="password" name="cpassword" id="cpassword" class="form-control" placeholder="Confirm password">
    <?php if(form_error('cpassword')) echo form_error('cpassword'); ?> 
  </div>
  <div class="form-group mb-2">
    <input type="submit" value="Set password" class="btn btn-block btn-md btn-success">
  </div>            
<?php echo form_close(); ?>

在模型中,我有两种插入令牌和更新密码的方法:

public function update_token($user_email, $reset_token) {
    $this->db
        ->where(['email' => $user_email])
        // insert token (make it diffrent from NULL)
        ->update('authors', array('token' => $reset_token));
}

public function set_new_password($hashed_email, $token, $enc_password) {
    $this->db
        ->where([md5('email') => $hashed_email])
        // set new password and reset token to NULL
        ->update('authors', array('password' => $enc_password, 'token' => NULL));
}

插入令牌没有问题,但设置新密码失败并出现404错误。

我做错了什么?

【问题讨论】:

  • HTTP Error 404 检查您的路由
  • 我确实检查过了。好像没问题。
  • 只需发布相关代码,其中仅包含设置新密码
  • 你尝试过什么调试问题?

标签: php codeigniter codeigniter-3


【解决方案1】:

我首先看到的是您的代码有错字问题。

你的路线上写着form_open(base_url('newpassword')); ?&gt;,但你却违抗了他们$route['newpasword']

newpassword != newpasword
     ^^             ^^

在 route.php 中

$route['newpasword'] = 'newpasword';
$route['newpasword/(:any)/(:any)'] = 'newpasword/index/$1/$2/';

第二个$route['newpasword/(:any)/(:any)'] = 'newpasword/index/$1/$2/'; 我们不使用在 URL 中发送密码。它应该是 POST 方法,因为您使用form_open 表单创建与method="post"。所以在代码中$_POST['password']$this-&gt;input-&gt;post() 可以工作

【讨论】:

    【解决方案2】:

    设置新密码后,您重定向到 /newpaswordNewpasword 控制器中的 index 功能仅适用于 2 个参数。您需要在控制器中创建一个新函数来查看成功页面(或使用会话警报重定向到主页)

    【讨论】:

    • 我认为表单的action属性不正确,因为它不包含index方法所取的2个参数。
    • 否,您之前使用 2 参数修改了 index 方法以处理来自电子邮件的新密码链接。现在这个索引方法适用于$route['newpasword/(:any)/(:any)'] = 'newpasword/index/$1/$2/'; 路由。
    • 那么,正因为如此,我不应该修改表单的action属性吗?
    • 不行,新建一个函数成功页就完成了
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多