验证电子邮件后的codeigniter登录

时间:2017-07-08 22:10:11

标签: php codeigniter login

我正在尝试确保用户可以在确认其电子邮件验证后登录,其中数据库中的STATUS从0更改为1.如何根据数据库中的状态更改来登录用户。提前致谢

MODEL:

   public function login($username, $password){
    //validation
    $this->db->where('username', $username);
    $this->db->where('password', $password);

    $result = $this->db->get('users');
    if($result->num_rows() == 1){
        return $result->row(0)->id;

    } else {
        return FALSE;
    }
}

控制器:

   public function login(){
    $data['title'] = 'Login';

    $this->form_validation-> set_rules('username', 'Username', 'required');
    $this->form_validation-> set_rules('password', 'Password', 'required');

    if($this->form_validation->run() === FALSE){

    $this->load->view('templates/header');
    $this->load->view('users/login', $data);
    $this->load->view('templates/footer');
    } else {

        // fetching user
    $username = $this->input->post('username');
        //password
    $password = ($this->input->post('password'));

    //login user
    $user_id = $this->user_model->login($username, $password);

    if($user_id){
        //creating session
        $user_data = array(
            'user_id' => $user_id,
            'username' => $username,
            'logged_in' => TRUE,

        );
        $this->session->set_userdata($user_data);
                // Set message to be sent
    $this->session->set_flashdata('user_login', 'Welcome');
    redirect('posts');
    } else {
        // Set message to be sent
    $this->session->set_flashdata('login_fail', 'Login Failed');
    redirect('users/login'); 
    }

    }

}

3 个答案:

答案 0 :(得分:2)

您只需要验证尝试登录的用户是否已经过验证(如果您的查询正确)。

为此,您可以在检查用户名和密码时在查询构建器中添加另一个where语句。所以你的模型就像

public function login($username, $password){
    //validation
    $this->db->where('username', $username);
    $this->db->where('password', $password);
    $this->db->where('status', '1');

    $result = $this->db->get('users');
    if($result->num_rows() == 1){
        return $result->row(0)->id;

    } else {
        return FALSE;
    }
}

现在,即使用户提交了正确的登录详细信息但尚未验证其帐户,他也无法登录。

答案 1 :(得分:1)

如果您询问如何检查该用户是否已经过验证,那么这应该是您的型号代码:

public function login($username, $password){

    $query = $this->db
            ->select('your_column')
            ->where(['user_email' => $user_name, 'user_password' => $user_password])
            ->where('user_verification_status','1')
            ->get('users');

            if ($query->num_rows() == 1) {
                $result = $query->row_array();
                return $result;
            } else {
                return FALSE;
            }

}

如果您想在注册后验证用户,那么您应该按照以下步骤操作:

  1. 当有人在您的系统中注册并且当时在registration table中保存该用户数据时,您应该使用输入的电子邮件并在用户电子邮件中发送经过验证的链接。
  2. 在该验证链接中,您已将其结构化为用户点击它时进入验证页面,此时您应更改用户状态并显示用户已验证的消息,现在您可以登录系统。
  3. 作为答案中给出的型号代码,您应该检查用户是否已经过验证。
  4. 如果您需要有关用户验证的更多详细信息,请与我们联系。

答案 2 :(得分:1)

考虑到您已准备好验证系统,并且您正在将db中的状态列从0更改为1。 使用下面的代码,您将能够通过通知用户以防止他未经验证来执行基于该要求的登录。

  

模型(返回正确错误):

public function login($username, $password){

  $this->db->where('username', $username);
  $this->db->where('password', $password);

  $result = $this->db->get('users');
  if($result->num_rows() == 1){
     $user=$result->row_array();
     if($user['status']==1){ // user is verified
       $response['error']="false";
       $response['user']=$user['id'];
     }
     else{ // not verified
        $response['error']="true";
        $response['error_msg']="Please verify your email first!";
     }

  } 
  else { // credentials mismatch
     $response['error']="true";
     $response['error_msg']="Invalid username or password";
  }
  return $response;
}
  

Controller(使用模型返回的数组)

//login user
$login = $this->user_model->login($username, $password);
if($login['error']){ // login failed
   $this->session->set_flashdata('login_fail', $login['error']);
   redirect('users/login');
}
else{ // success
    $user=$login['user'];
    // do whatever you want after successful login
}