登录验证在CodeIgniter中不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了登录验证在CodeIgniter中不起作用相关的知识,希望对你有一定的参考价值。

您好,所以我在CodeIgniter中构建了一个登录系统,在允许访问特定页面之前,数据库应满足3个验证步骤。

三个步骤的值是:activeis_memberis_admin

这是我在Users控制器中创建的代码:

public function login(){
    // Prohibit access if already logged in
    $this->User_model->session_comprobate_member();

    $this->form_validation->set_rules('username','Username','trim|required|min_length[4]');
    $this->form_validation->set_rules('password','Password','trim|required|min_length[4]');


    if ($this->form_validation->run() == FALSE){
        //Load View Into Template
        $this->template->load('public','login','users/login');
    } else {
       // Get Post Data from Database
        $username = $this->input->post('username');
        $password = $this->input->post('password');
        $enc_password = md5($password);
        $data_user = $this->User_model->login($username, $enc_password);

        if($data_user == true){
            $user_id = $this->User_model->get_userid($username);
            $users   = $this->User_model->get_username($user_id);

            if($users->active == 0){

            // Create error
            $this->session->set_flashdata('error', 'This account is banned or inactive');

            // Redirect to page
            redirect('dashboard/login');

            }

            if($users->is_admin == 0){

            // Create error
            $this->session->set_flashdata('error', 'You do not have permission to view this page');

            // Redirect to page
            redirect('dashboard/login');

            }

            if($users->is_member == 0){

            // Create error
            $this->session->set_flashdata('error', 'This account does not exists. Please try again.');

            // Redirect to page
            redirect('dashboard/login');

            } else {
            $sess_data = array(
                'user_id' => $user_id,
                'username'  => $username,
                'occupation' => 'occupation',
                'is_member' => true,
                'is_admin' => true,
                'active' => true
            );

            // Set Session Data
            $this->session->set_userdata($sess_data);

            // Create Message
            $this->session->set_flashdata('success', 'You are logged in');

            // Redirect to pages
            redirect('dashboard');
            }
        } else {
            // Create Error
            $this->session->set_flashdata('error', 'Invalid Login');

            // Redirect to pages
            redirect('dashboard/login');
        }
    }
}

根据用户帐户,这些值中的每一个都设置为TRUE(1)FALSE(0)。我有一个树的值等于1的帐户,所以它应该允许我访问;这是一张图片:Database images showing values set to true or false我想要的是在登录验证满足三个值之后允许访问但是出于某种原因甚至在将用户全部设置为TRUE之后如果只是一直让我抛出我创建的第一个错误:

$this->session->set_flashdata('error', 'This account is banned or inactive');

知道怎么解决吗?谢谢。

这是我的模型:

    public function get($id)
    {
        $this->db->where('id', $id);
        $query = $this->db->get($this->table);
        return $query->row();
    }    
public function login($username, $password)
    {
        $this->db->select('*');
        $this->db->from($this->table);
        $this->db->where('username', $username);
        $this->db->where('password', $password);
        $this->db->limit(1);

        $query = $this->db->get();

        if ($query->num_rows() == 1) {
            return $query->row()->id;
        } else {
            return false;
        }
    }

    //I need to work on these two
    public function get_username($users) {
        $this->db->select('id');
        $this->db->from($this->table);
        $this->db->where('username', $users);
        return $this->db->get()->row;
    }

    public function get_userid($user_id) {
        $this->db->select('id');
        $this->db->from($this->table);
        $this->db->where('id', $user_id);
        return $this->db->get()->row();
    }
    ///
    //Check if admin
    public function is_admin($id) {
        $this->db->select('is_admin');
        $this->db->from($this->table);
        $this->db->where('id', $id);
        $is_admin = $this->db->get()->row('is_admin');
        if ($is_admin == 0) {
            redirect('/');
        } else {
            redirect('admin');
        }
    }

    //Check if member
    public function is_member($id) {
        $this->db->select('is_member');
        $this->db->from($this->table);
        $this->db->where('id', $id);
        $is_member = $this->db->get()->row('is_member');
        if ($is_member == 0) {
            redirect('/');
        } else {
            redirect('dashboard/login');
        }
    }

    //Check if active
    public function is_active($id) {
        $this->db->select('active');
        $this->db->from($this->table);
        $this->db->where('id', $id);
        $is_active = $this->db->get()->row('active');
        if ($is_active == 0) {
            redirect('/');
        } else {
            redirect('dashboard/login');
        }
    }

再一次感谢你的帮助。

答案

假设username是表中的唯一列:

调节器

// user login
if($data_user == true) {

    // $username from $this->input->post('username');
    // call model function
    $user = $this->User_model->get_username($username);

    // is active user ?
    if($user['active'] == 0) {

        // Create error
        $this->session->set_flashdata('error', 'This account is banned or inactive');

        // Redirect to page
        redirect('dashboard/login');

    }

    // is admin ?
    if($user['is_admin'] == 0) {

        // Create error
        $this->session->set_flashdata('error', 'You do not have permission to view this page');

        // Redirect to page
        redirect('dashboard/login');

    }

    // is member ?
    if($user['is_member'] == 0) {

        // Create error
        $this->session->set_flashdata('error', 'This account does not exists. Please try again.');

        // Redirect to page
        redirect('dashboard/login');

    } else {

        $sess_data = array(
            'user_id' => $user['id'],
            'username'  => $user['username'],
            'occupation' => 'occupation',
            'is_member' => true,
            'is_admin' => true,
            'active' => true
        );

        // Set Session Data
        $this->session->set_userdata($sess_data);

        // Create Message
        $this->session->set_flashdata('success', 'You are logged in');

        // Redirect to pages
        redirect('dashboard');
    }

} else {

    // Create Error
    $this->session->set_flashdata('error', 'Invalid Login');

    // Redirect to pages
    redirect('dashboard/login');
}

这个模型为get_username()

public function get_username($username) {

    // select field we needed
    $this->db->select('id', 'username', active, is_admin, is_member);
    $this->db->from($this->table);
    $this->db->where('username', $username);
    $this->db->limit(1);

    $query = $this->db->get();

    // check is $query have a data ?
    if ($query->num_rows() > 0) {

        // return data
        return $query->row_array();

    } else {

        // redirect login, because no data with that username
        redirect('dashboard/login');

    } 
}
另一答案

在模型中的get_username()中,您只选择id,而在控制器中,您正在检查活动列中的值。在get_username()选择中添加活动列。

以上是关于登录验证在CodeIgniter中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

来自fabric的Twitter登录在片段中不起作用

表单验证在我的 CI 项目中不起作用(已修复,代码已更新)

$ _POST在codeigniter中不起作用

Codeigniter:php 在视图中不起作用!

插件在 CodeIgniter 中不起作用

CodeIgniter路由在子目录中不起作用