1

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

2 回答 2

1

这是正在发生的事情。

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

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

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

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

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

于 2012-06-14T10:54:31.237 回答
0

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

创建一个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否则你将处于无限循环中。

于 2012-06-14T01:41:27.697 回答