【问题标题】:Codeigniter Session returning 310 redirectCodeigniter 会话返回 310 重定向
【发布时间】:2012-06-13 21:39:29
【问题描述】:

我有一个回调函数来检查我的登录详细信息是否正确 - 如果它们错误,它会返回一个错误(这工作正常)。如果详细信息正确,则应设置会话 $this->session->set_userdata('logged_in',TRUE);,然后继续使用函数 login 并重定向到仪表板 - 此重定向工作正常。

在我的function index(){} 任何仪表板页面上都有一行

if($this->session->userdata('logged_in')) redirect('dashboard/home');

上面那一行是导致我的 310 重定向的那一行,但我不确定为什么?

我想检查用户是否登录重定向到dashboard/home,否则返回登录页面home/login

控制器:

class Home extends CI_Controller {

    function __construct() {
            parent::__construct();
        }    

    public function index()
    {
        //if($this->session->userdata('logged_in')) redirect('dashboard/home');

        $data['contentMangement'] = $this->options_model->systemOptions();
        $data['pageTitle'] = 'Login';
        $data['message'] = "";
        $this->load->view('_assets/header', $data);
        $this->load->view('login', $data);
        $this->load->view('_assets/footer');
    }

    public function login() {
          $this->form_validation->set_rules('userEmail','Username', 'required|valid_email|trim|max_length[99]|xss_clean');
            $this->form_validation->set_rules('userPassword','Password', 'required|trim|max_length[200]|xss_clean|callback__checkUsernamePassword');

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

                $data['contentMangement'] = $this->options_model->systemOptions();
                $data['pageTitle'] = 'Login';
                $data['message'] = validation_errors('<div class="alert alert-error">', '</div>');
                $this->load->view('_assets/header', $data);
                $this->load->view('login', $data);
                $this->load->view('_assets/footer');

            }elseif($this->form_validation->run() === TRUE){

            redirect('dashboard/home');
        }
    }


    function _checkUsernamePassword() {

            $username = $this->input->post('userEmail');
            $password = $this->input->post('userPassword');

            $user = $this->user_model->check_login($username,$password);

            if(! $user)
            {
                $this->form_validation->set_message('_checkUsernamePassword', 'Sorry the details you provided have not been found');
                return FALSE;
            }else{
                 $this->session->set_userdata('logged_in',TRUE);
                return TRUE;
            }   
    }
}

【问题讨论】:

  • 我们可以在dashboard/home上看到验证码吗?
  • @MikeCruz13 登录验证?我没有仪表板/主页的任何验证代码,它只是视图
  • 您也可以发布您的控制器吗?根据您的控制器的外观,我的回答可能有误。
  • @xbonez 我已经发布了整个控制器 :)
  • @JessMcKenzie:好的,在这种情况下,我的回答是正确的。我正在取消删除它。

标签: php codeigniter session redirect


【解决方案1】:

这就是正在发生的事情。

假设我正确登录,在您的登录控制器中,您设置了logged_in = TRUE,并将我重定向到dashboard/home。在dashboard/homeindex() 函数中,如果logged_in = TRUE(它是)你再次将我重定向到dashboard/home。再次检查logged_in = TRUE,然后再次重定向我,依此类推。

这会导致无限重定向循环,从而导致 310 错误(重定向过多)。

您需要重新进行登录检查。在index()dashboard/home 中,执行以下操作:

if ($this-&gt;session-&gt;userdata('logged_in') === FALSE) redirect(site_url('dashboard/login'));

现在,当我访问仪表板主页时,您只会在我未登录时将我重定向。这可以保护您的仪表板主页免受未经身份验证的用户的攻击,同时不会使经过身份验证的用户陷入无限循环。

【讨论】:

    【解决方案2】:

    我认为您首先应该创建一个MY_Controller 来执行此操作,如果有一天您决定将会话变量名称从logged_in 更改为logged 怎么办?您会打开所有控制器并更改其会话吗?

    创建MY_Controller,您将使所有其他控制器,如Home_Controller 扩展MY_Controller,如:

    class Home extends MY_Controller
    {
        public function __construct()
        {
            parent::__construct();
        }
    }
    

    你的MY_Controller

    //under /application/core/
    class MY_Controller extends Controller
    {
      public function __construct()
      {
        parent::__construct();
        if(!$this->session->userdata('logged_in'))
           redirect('login');
      }
    }
    

    当然,在您的 Login_Controller 上,您将扩展 Controller 而不是 MY_Controller,否则您将处于无限循环中。

    【讨论】:

      猜你喜欢
      • 2013-08-11
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 2013-01-06
      • 2012-08-17
      相关资源
      最近更新 更多