2012-09-07 110 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'); 
}