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