登录验证通过后重定向异常且Dashboard加载失败问题求助
你遇到的问题确实挺让人头疼的——输入正确凭据后不仅跳不到Dashboard,反而退回登录页,就算侥幸"登录成功",Dashboard也加载失败。结合你贴出的代码,我梳理了几个核心问题点,咱们一步步来解决:
1. 先补全最关键的check_database回调函数
你只贴了Login控制器的代码,但完全没提到check_database这个回调方法!这可是登录逻辑的核心——它负责验证用户名密码,更重要的是必须在验证通过后给session写入logged_in标识。如果这个方法没做这件事,Dashboard的构造函数检查$this->session->userdata('logged_in')时永远会返回false,直接把你踢回登录页,形成死循环。
正确的check_database实现应该是这样的:
public function check_database($password) { $username = $this->input->post('username'); // 调用模型验证账号密码 $user = $this->login_model->verify_user($username, $password); if($user) { // 把用户信息存入session,关键是设置logged_in字段 $session_data = [ 'logged_in' => true, 'user_id' => $user->id, 'username' => $user->username ]; $this->session->set_userdata($session_data); return TRUE; } else { $this->form_validation->set_message('check_database', '账号或密码错误'); return FALSE; } }
2. 检查Session配置是否正常工作
如果session根本存不住数据,那logged_in标识永远不会存在,自然跳不了Dashboard。打开application/config/config.php检查这几个关键配置:
$config['sess_driver']:如果用数据库存session,要确保已创建session表;用file驱动的话,sess_save_path要指向服务器可写的目录$config['sess_cookie_name']:确保没有和其他cookie冲突$config['sess_expiration']:不要设置成0(永久有效)除非你确定需要$config['sess_secure']:如果网站用HTTPS,要设为TRUE,否则session可能丢失
3. 优化登录控制器的表单提交判断
你当前用if(isset($_POST))来判断是否提交表单,这会导致哪怕是空POST请求也会触发验证逻辑。改成更严谨的判断:
if($this->input->server('REQUEST_METHOD') === 'POST') { // 加载表单验证并执行规则 $this->load->library('form_validation'); $this->form_validation->set_rules('username', '账号', 'trim|required'); $this->form_validation->set_rules('password', '密码', 'trim|required|callback_check_database'); if($this->form_validation->run() == TRUE) { redirect('dashboard'); // 直接写控制器名比base_url().'dashboard'更简洁可靠 } }
4. 修正Dashboard的重定向逻辑
当前Dashboard构造函数里用redirect(base_url())跳回登录页,虽然没问题,但直接指向Login控制器更明确,避免base_url配置异常导致的问题:
if(!$this->session->userdata('logged_in')) { redirect('login'); // 直接跳转到Login控制器的index方法 }
5. 验证登录模型的查询逻辑
确保你的login_model里的验证方法能正确从数据库取到用户数据,比如:
public function verify_user($username, $password) { // 注意:生产环境一定要用password_hash/password_verify,别用明文或md5! $this->db->where('username', $username); $this->db->where('password', password_hash($password, PASSWORD_DEFAULT)); $query = $this->db->get('users'); return $query->num_rows() === 1 ? $query->row() : false; }
总结
最可能的元凶就是**check_database没设置logged_in session**,其次是session配置异常。按照上面的步骤逐一排查,应该就能解决登录跳转的问题了。
内容的提问来源于stack exchange,提问作者drey_1




