基于用户角色实现CodeIgniter登录后跳转至管理员/用户页面
解决方案:根据用户角色实现登录后跳转
我看了你的代码,发现几个小问题导致角色判断和跳转无法正常工作,下面是修正后的完整代码和关键点说明:
首先修正模型代码
原模型方法缺少public访问修饰符,而且可以优化查询逻辑(用row()代替result()更适合单用户记录的场景):
public function get_user($email, $pwd) { $this->db->where('email', $email); $this->db->where('password', md5($pwd)); // 用row()返回单个用户对象,比result()的数组形式更直观 $query = $this->db->get('ea_users'); return $query->row(); }
然后修正控制器代码
主要修复角色判断的语法错误,同时把用户角色存入会话(方便后续其他页面权限判断):
public function index() { // 获取表单输入 $email = $this->input->post("email"); $password = $this->input->post("password"); // 表单验证 $this->form_validation->set_rules("email", "Email-ID", "trim|required"); $this->form_validation->set_rules("password", "Password", "trim|required"); if ($this->form_validation->run() == FALSE) { // 验证失败,返回登录页 $this->load->view('login_view'); } else { // 验证用户凭证 $user = $this->model_user->get_user($email, $password); if ($user) { // 直接判断对象是否存在,比count数组更简洁 // 设置会话,新增角色字段方便后续权限校验 $sess_data = array( 'login' => TRUE, 'uname' => $user->first_name, 'ulname' => $user->last_name, 'uemail' => $user->email, 'uphone' => $user->phone_number, 'uaddress' => $user->address, 'ucity' => $user->city, 'uin' => $user->injury, 'uid' => $user->id, 'urole' => $user->id_roles // 新增角色存储,后续页面可直接调用 ); $this->session->set_userdata($sess_data); // 根据角色跳转:3=普通用户→预约页,2=管理员→管理页 if($user->id_roles == 3) { redirect('appoinments/index'); } else { redirect('admin/index'); } } else { $this->session->set_flashdata('msg', '<div class="alert alert-danger text-center">Wrong Email-ID or Password!</div>'); redirect('login/index'); } } }
关键修改点说明
- 模型返回值优化:把
result()改成row(),因为我们查询的是单个用户,返回对象比数组更方便直接访问属性,也避免了数组索引的麻烦 - 角色判断语法修复:原代码
$uresult->['id_roles']是语法错误,现在通过$user->id_roles直接访问对象属性 - 会话新增角色字段:把用户角色存入会话,后续在管理员页面或其他页面可以直接通过
$this->session->userdata('urole')判断用户权限,不用重复查询数据库 - 存在性判断优化:用
if ($user)代替count($uresult) > 0,更简洁直观,因为row()如果没找到记录会返回null
这样修改后,登录时就能根据用户的id_roles值正确跳转到对应的页面了。
内容的提问来源于stack exchange,提问作者Lainey
相关产品推荐
相关产品推荐

