3

我已经成功地使用代码点火器对用户进行了身份验证,但是现在如果用户在我的一个控制器中输入一个方法的路由,他们可以在不登录的情况下访问它。

我想停止对没有登录的用户进行这种访问,最好不使用第 3 方用户身份验证插件。

我有这个模型代码:

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()

尚未登录的用户无法访问书籍方法,但在此之后他们可以访问任何其他方法,我只是想停止该访问并将错误页面传递给他们,通知他们必须登录。

在此先感谢,汤姆

4

3 回答 3

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控制器中的所有内容都受到保护。

为了进一步了解这个概念 - 研究使用 aMY_Controller并让你的所有后端控制器都从这里扩展。

于 2012-09-07T12:36:41.887 回答
1

要么我误解了你的问题,要么解决方案非常简单。

function books_page() {
   if(!$this->admin_model->logged_in()) {
      redirect('auth/login'); ## OR $this->load->view("error_page"); exit();
   }
   ## All your code, etc.
}
于 2012-09-07T12:38:10.780 回答
1

我会像这样在控制器顶部声明一个变量:

private $logged_in = false;

然后在构造函数中我会像这样初始化它:

$this->logged_in = $this->session->userdata('logged_in');

然后您可以禁用对所需方法的访问(如果您将检查放入构造函数,则可以禁用完整的控制器):

if($this->logged_in)
{
   //do stuff
}
else
{
   redirect(base_url().'login');
}
于 2012-09-07T12:38:45.490 回答