我有登录表单,然后我尝试直接访问控制器,它有效! 如何防止此访问?
我上了一节课
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');
}
}
然后我尝试直接访问控制器,页面显示无限刷新,我希望页面显示登录表单
我该如何解决这个问题?
几点评论:
- 在
$this->session->set_userdata('islogin');
行上,您应该传递第二个参数,该参数是要分配的值(大概,TRUE 是您要放置的值) - 我认为您的重定向行是错误的方式。如果用户未登录,则需要重定向到登录。现在,如果用户未登录,您的代码所做的是重定向到主页,因此存在无限循环(因为此代码位于主页中!
$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');
}
您需要做的是设置一个基本控制器,该控制器将为您照顾会话,并通过继承将已登录的控制器与注销的控制器分开。
关于如何最好地管理登录和注销状态,这是一个常见问题。有关如何操作的详细说明,请参阅此答案。