You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

登录验证通过后重定向异常且Dashboard加载失败问题求助

登录后无法重定向到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

火山引擎 最新活动