我已经成功使用代码点火器对用户进行了身份验证,但现在如果用户键入路由到我的一个控制器中的方法,他们就可以在不登录的情况下访问它。
我想停止对未登录的用户的访问权限,而不使用第三方用户身份验证插件。
我有这个型号代码:
function login(){
$data = array(
'username' => $this->input->post('username'),
'logged_in' => TRUE
);
$this->session->set_userdata($data);
} //function login()
function logged_in(){
if($this->session->userdata('logged_in') == TRUE)
{
return TRUE;
}
return FALSE;
} //function logged in()
我有这个控制器代码:
function index($condition = FALSE){
if($this->admin_model->logged_in() === TRUE)
{
$this->books_page(TRUE);
}
else
{
$data = $this->style_model->admin_area();
$data['page_intro'] = 'Oops! Sorry, you must be logged in to view this page.';
$this->load->view('admin/not_logged_in', $data);
}
} //function index()
function books_page(){
$data = $this->style_model->admin_area();
$data['category_query'] = $this->admin_books_model->get_book_categories();
$data['page_title'] = 'Books';
$data['query'] = $this->admin_books_model->get_books();
$this->load->view('admin/books/books_admin', $data);
} //function books_page()
尚未登录的用户无法访问books方法,但在此之后他们可以访问的任何其他方法,我只想停止该访问并向他们传递错误页面,通知他们必须登录。
提前致谢, 汤姆
答案 0 :(得分:4)
最好的方法是将逻辑分成两个(或更多)控制器。
在后端控制器中执行此操作
class Backend extends CI_Controller
{
public function __construct()
{
parent::__construct();
if( ! ($this->admin_model->logged_in())
{
// Not logged in - so force them away
redirect ('place login page here');
}
}
}
然后backend
控制器中的所有内容都受到保护。
要进一步理解这一概念 - 请研究使用MY_Controller
并使所有后端控制器从此扩展。
答案 1 :(得分:1)
要么我误解了你的问题,要么解决方案非常简单。
function books_page() {
if(!$this->admin_model->logged_in()) {
redirect('auth/login'); ## OR $this->load->view("error_page"); exit();
}
## All your code, etc.
}
答案 2 :(得分:1)
我会在控制器顶部声明一个变量,如下所示:
private $logged_in = false;
然后在构造函数中我会像这样初始化它:
$this->logged_in = $this->session->userdata('logged_in');
然后你可以禁用对所需方法的访问(如果你把检查放在构造函数中,则禁用完整的控制器):
if($this->logged_in)
{
//do stuff
}
else
{
redirect(base_url().'login');
}