2012-09-07 77 views
3

我已经验证使用代码点火器成功的用户,但现在如果用户在一个路由类型在我的控制器的一个方法,他们可以无需登录访问。CodeIgniter用户认证

我想停止对未登录的用户的访问,最好不使用第三方用户认证插件。

我有这个型号代码:

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

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

由于提前, 汤姆

+3

就像一个想法,你可能会考虑进入CodeIgniter的[TankAuth](http://konyukhov.com/soft/tank_auth/)。一旦你了解它,它非常安全,让生活变得非常容易。 FWIW。 – David

回答

4

最好的办法是将逻辑分成两个(或更多)控制器。

  • A“前端”控制器 - 其中用户不需要被记录在 为它的任何
  • A“后端”控制器(S) - ,其中该用户必须是 登录为所有这一切都

在后端控制器只是这样做

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控制器protecte d。

为了进一步理解这个概念 - 使用MY_Controller进行研究,并让所有的后端控制器从此延伸。

+0

嗨大家感谢您的帮助我真的很感激它,起初我尝试从奴隶的答案,这工作完美但我喜欢使用MY_Controller类(TheShiftExchange答案)的想法,因为它更有效,并使用较少的代码(不重复)。我对此做了一些研究,现在我已经开始工作了,再次感谢大家非常感谢。 – Tom

1

我错误地理解了你的问题,或者解决方案非常简单。

function books_page() { 
    if(!$this->admin_model->logged_in()) { 
     redirect('auth/login'); ## OR $this->load->view("error_page"); exit(); 
    } 
    ## All your code, etc. 
} 
1

我想声明一个变量在控制器的顶部是这样的:

private $logged_in = false; 

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

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

然后你就可以禁用访问所需的方法(或完整的控制器,如果你把你的支票放在构造函数中):

if($this->logged_in) 
{ 
    //do stuff 
} 
else 
{ 
    redirect(base_url().'login'); 
}