2个用户在CodeIgniter框架中以1种形式登录(多级登录系统)

时间:2018-03-24 18:50:08

标签: php forms codeigniter login codeigniter-3

我在网站上工作,有2个用户可以登录我的网站,两个用户都是我数据库中的不同表:

1. administrator
2. werknemer

对于这两个用户,我有不同的登录表单和登录控制器功能,但我想要的是两个用户只能以1个表单登录。 我只是不知道该怎么做。

这是我的login.php视图文件中的2个视图表单:

  <?php  echo form_open('index.php/Auth/werknemer_login'); ?>
                <div class="form-group">
                    <input class="form-control" name="naam" id="naam" type="text" placeholder="Naam">
                </div>

                <div class="form-group">
                    <input class="form-control" name="wachtwoord" id="wachtwoord" type="password" placeholder="Wachtwoord">
                </div>

                <a href="" id="wachtwoordvergeten">Wachtwoord vergeten?</a>



                <br>
                <div>
                    <button class="btn btn-primary" name="werknemer_login" >Inloggen</button>
                    <br><br><br><br>
                </div>
            </form>



        </div>

    <div class="clearfix"></div>


    <!-- ----------------verticale lijn-------------------- -->



    <!-- ----------------Administrator inloggen-------------------- -->
    <div class="main1" id="administrator_login">
            <br>
            <h3 class="headerh3">Administrator inloggen</h3>
               <?php  echo form_open('index.php/Auth/administrator_login'); ?>
                <div class="form-group">
                    <input class="form-control" name="naam" id="naam" type="text" placeholder="Naam">
                </div>

                <div class="form-group">
                    <input class="form-control" name="wachtwoord" id="wachtwoord" type="password" placeholder="Wachtwoord">
                </div>

                <a href="" id="wachtwoordvergeten">Wachtwoord vergeten?</a>



                <br>
                <div>
                    <button class="btn btn-primary" name="administrator_login" >Inloggen</button>
                    <br><br><br><br>
                </div>
            </form>

这些是我的Auth.php控制器中的登录控制器功能:

public function administrator_login()
    {
            $this->form_validation->set_rules('naam', 'Naam', 'required');
            $this->form_validation->set_rules('wachtwoord', 'Wachtwoord', 'required|min_length[5]');

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

                $naam = $_POST['naam'];
                $wachtwoord = ($_POST['wachtwoord']);


                //check gebruiker in database
                $this->db->select('*');
                $this->db->from('administrator');
                $this->db->where(array('naam'=>$naam));
                $query = $this->db->get();
                $administrator = $query->row();


                //Als gebruiker bestaat
                if($administrator->naam) 
                {
                    $this->session->set_flashdata("success","U bent nu ingelogd als administrator");
                    //Als er een user is maak session date
                        $_SESSION['administrator_level'] = 1; 
                        $_SESSION['administrator_logged'] = TRUE; 
                        $_SESSION['naam'] = $administrator->naam;
                        $_SESSION['wachtwoord'] = $administrator->wachtwoord;

                  //link naar werknemer/administrator view pagina
                 redirect("index.php/Welkomadministrator", "refresh");
                }
                $this->session->set_flashdata("success","U bent nu ingelogd");
                }
                else{
                    $this->session->set_flashdata('error','Verkeerde naam of wachtwoord');
                //wanneer er een foutmelding is link weer naar de login pagina
                redirect("" , "refresh");
            }

                  //laad de login pagina
              //    $this->load->view('login');

    }


    // Login code voor de administrator
    public function werknemer_login()
    {       
            $this->form_validation->set_rules('naam', 'Naam', 'required');
            $this->form_validation->set_rules('wachtwoord', 'Wachtwoord', 'required|min_length[5]');

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

                $naam = $_POST['naam'];
                $wachtwoord = ($_POST['wachtwoord']);


                //check gebruiker in database
                $this->db->select('*');
                $this->db->from('werknemer');
                $this->db->where(array('naam'=>$naam));
                $query = $this->db->get();
                $werknemer = $query->row();


                //Als gebruiker bestaat
                 if($werknemer->naam) 
                 {
                     $this->session->set_flashdata("success","U bent nu ingelogd als werknemer");
                        //Als er een user is maak session date
                        $_SESSION['werknemer_level'] = 1; 
                        $_SESSION['werknemer_logged'] = TRUE; 
                        $_SESSION['naam'] = $werknemer->naam;
                        $_SESSION['wachtwoord'] = $werknemer->wachtwoord;
                 }       
              //link naar administrator/werknemer view pagina
                 redirect("index.php/Welkomwerknemer", "refresh");

                $this->session->set_flashdata("success","U bent nu ingelogd");
                }

                else{
                    $this->session->set_flashdata('error','Verkeerde naam of wachtwoord');
                //wanneer er een foutmelding is link weer naar de login pagina
                redirect("" , "refresh");
                }
                  //laad de login pagina
                  //$this->load->view('login');
            } 

所以我的问题是有没有办法让2个用户登录1表单?

2 个答案:

答案 0 :(得分:0)

是的,有很多方法。您可以在登录表中为角色添加一个额外的列。这减少了你需要的一个额外的桌子。登录后,您可以检查登录用户的角色,然后将其重定向到该页面。这是最优选的一个。

对于具有两个表的一个表单的第二个,如果存在用户详细信息,则首先在管理表中检查用户条目&amp;如果用户详细信息不存在,则将其重定向到管理页面,然后检查其他表,然后重定向到常规用户页面(如果凭据正确)。

假设两个表中都没有用户详细信息,则表示该用户未注册或输入了错误的ID。

答案 1 :(得分:0)

我注意到评论中记录了一些错误。使用以下代码,您可以从同一控制器登录两个用户组,同时保持当前的表结构。我想补充一点,这不会开箱即用 - 您必须使用模型中的hash_password()来散列您当前存储在数据库中的任何纯文本密码 - 这是为了您的用户安全

注意:as per the docs数据库中的密码字段必须允许输入等于或大于255个字符

  

建议将结果存储在可以的数据库列中   扩展超过60个字符(255个字符将是一个不错的选择)。

控制器:

class Somecontroller extends CI_Controller {

    public function login() {
        $this->form_validation->set_rules('naam', 'Naam', 'required');
        $this->form_validation->set_rules('wachtwoord', 'Wachtwoord', 'required|min_length[5]');
        if ($this->form_validation->run() == false) {
            $this->session->set_flashdata('error', validation_errors());
            redirect('', 'refresh');
        }
        $this->load->model('auth_model');
        $naam = $this->input->post('naam');
        $wachtwoord = $this->input->post('wachtwoord');
        if (($admin = $this->auth_model->get_user($naam, 'administrator')) !== false) {
            if (!$this->auth_model->verify_password($wachtwoord, $admin->wachtwoord)) {
                $this->session->set_flashdata('error', 'Name or password is invalid.');
                redirect('', 'refresh');
            }
            $_SESSION['administrator_level'] = 1;
            $_SESSION['administrator_logged'] = TRUE;
            $_SESSION['naam'] = $admin->naam;
            // Don't store the users password in a session
            //$_SESSION['wachtwoord'] = $admin->wachtwoord;
            $this->session->set_flashdata("success","U bent nu ingelogd");
            redirect('index.php/Welkomadministrator', 'refresh');
        } elseif (($user = $this->auth_model->get_user($naam, 'werknemer')) !== false) {
            if (!$this->auth_model->verify_password($wachtwoord, $user->wachtwoord)) {
                $this->session->set_flashdata('error', 'Name or password is invalid.');
                redirect('', 'refresh');
            }
            $_SESSION['werknemer_level'] = 1;
            $_SESSION['werknemer_logged'] = TRUE;
            $_SESSION['naam'] = $user->naam;
            //$_SESSION['wachtwoord'] = $user->wachtwoord;
            $this->session->set_flashdata("success","U bent nu ingelogd");
            redirect('index.php/Welkomwerknemer', 'refresh');
        } else {
            // we couldn't find the user in either table, they must not exist
            $this->session->set_flashdata('error', 'User does not exist in the system.');
            redirect('', 'refresh');
        }
    }

}

型号:

class Auth_model extends CI_Model {

    /**
     * Gets a user from the db
     * 
     * @param mixed $naam
     * @param string $table
     * @return boolean|obj
     */
    public function get_user($naam, $table) {
        $query = $this->db->get_where($table, array('naam' => $naam));
        if ($query->num_rows() > 1) {
            return $query->row();
        }
        return false;
    }

    /**
     * Verifies password matches the hashed password stored in db
     * 
     * @param string $password user keyed in password
     * @param string $db_password password from db
     * @return boolean
     */
    public function verify_password($password, $db_password) {
        return password_verify($password, $db_password);
    }

    /**
     * Hashes a password to be stored in db
     * 
     * @param mixed $password
     * @return hashed password
     */
    public function hash_password($password) {
        return password_hash($password, PASSWORD_DEFAULT);
    }

}