代码点火器登录直接访问控制器失败



我有登录表单,然后我尝试直接访问控制器,它有效! 如何防止此访问?

我上了一节课

class C_home extends CI_Controller{
public function __construct() {
    parent::__construct();
    $this->session->set_userdata('islogin'); //to set session islogin
}
function index()
{
    if ($this->session->userdata('islogin') != TRUE) 
    {
        redirect('c_home','refresh'); //caused infinite refresh
    }
        redirect('c_login', 'refresh');
}
}

然后我尝试直接访问控制器,页面显示无限刷新,我希望页面显示登录表单

我该如何解决这个问题?

几点评论:

  1. $this->session->set_userdata('islogin');行上,您应该传递第二个参数,该参数是要分配的值(大概,TRUE 是您要放置的值)
  2. 我认为您的重定向行是错误的方式。如果用户未登录,则需要重定向到登录。现在,如果用户未登录,您的代码所做的是重定向到主页,因此存在无限循环(因为此代码位于主页中!
  3. $this->session->set_userdata('islogin', TRUE);行显然应该在您的登录控制器中,但我猜您将其放在这里只是为了测试目的?

我宁愿这样做

class C_home extends CI_Controller {
public function __construct()
{
    parent::__construct();
}
function index()
{
    if ($this->session->userdata('islogin') != TRUE) 
    {
        redirect('c_home/login','refresh'); // go for login
    }
    // do something for loged in users here
}
function login()
{
    if ($this->session->userdata('islogin') == TRUE) 
    {
        redirect('c_home','refresh'); // get back home
    }
    // perform some login logic here
    // then, if successful
    {
        $this->session->set_userdata('islogin',TRUE);
        redirect('c_home','refresh'); // get back home
    }
    // or else
    // display login form here 
}

当然,使用像这样的第三方登录库总是更好的 https://github.com/DaBourz/SimpleLoginSecure

你应该访问控制器,这是他们控制事物的重点。如果您有不想通过 URL 访问的特定函数,请在函数名称前面加上 _ _notForPublicFunction。至于无限的刷新...

if(!$this->session->userdata('isLogin'))
{
    redirect('c_login');
} else {
    redirect('c_home');
}

您需要做的是设置一个基本控制器,该控制器将为您照顾会话,并通过继承将已登录的控制器与注销的控制器分开。

关于如何最好地管理登录和注销状态,这是一个常见问题。有关如何操作的详细说明,请参阅此答案。

相关内容

最新更新