Codeigniter会话返回310重定向

时间:2012-06-13 21:39:29

标签: php codeigniter session redirect

我有一个回调函数,可以检查我的登录详细信息是否正确 - 如果错误则返回错误(这很正常)。如果细节正确,则应设置会话$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;
            }   
    }
}

2 个答案:

答案 0 :(得分:1)

这是发生了什么。

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

这导致无限重定向循环,导致310错误(重定向太多)。

您需要重新设计登录检查。在logged_in = TRUE的{​​{1}}中,执行以下操作:

index()

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

答案 1 :(得分:0)

我认为您首先应该创建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,否则您将无限循环。