0

我有登录表单,然后我尝试直接访问控制器,它可以工作!我如何防止这种访问?

我有一些课

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');
}
}

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

我该如何解决这个问题?

4

4 回答 4

1

一些评论:

  1. 在线上$this->session->set_userdata('islogin');,您应该传递第二个参数,该参数是要分配的值(大概, TRUE 是您的意思)
  2. 我认为您的重定向行是错误的。如果用户未登录,则您希望重定向到登录。现在,如果用户未登录,您的代码所做的就是重定向到主页,因此是无限循环(因为此代码在主页中!
  3. $this->session->set_userdata('islogin', TRUE);行显然应该在您的登录控制器中,但我猜您将它放在这里只是为了测试目的?
于 2012-10-12T10:37:50.597 回答
0

您应该访问控制器,这是他们控制事物的关键。如果您有不希望通过 URL 访问的特定函数,请在函数名称前加上 _,例如 _notForPublicFunction。至于无限刷新……

if(!$this->session->userdata('isLogin'))
{
    redirect('c_login');
} else {
    redirect('c_home');
}
于 2012-10-12T10:38:06.633 回答
0

我宁愿这样做

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

于 2012-10-12T14:24:32.957 回答
0

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

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

于 2012-10-12T17:24:00.690 回答