2013-05-17 160 views
5

檢查用戶是否登錄最安全的方法是什麼?我使用php的框架,codeigniter。檢查用戶是否登錄

$loggedIn = $this->session->userdata('is_logged_in'); // returns 1 
if($loggedIn == true): ?> 
    // do something 
<?php endif; ?> 

這個代碼是在控制器還是在視圖中有關係嗎?

回答

0

代碼最好放置在控制器中,以便根據用戶是否登錄顯示正確的視圖。安全?你想要避免什麼?使用CI是檢查和查看用戶當前是否登錄的最常用方法...只要您正確設置is_logged_in變量即可。

1

當您_construct控制器,你可以找到他們是否登錄或從一開始。如果他們不是,將它們發送到登錄屏幕:

function __construct() { 
    parent::__construct(); 
    if (!$this->session->userdata('logged_in')) { 
      redirect('YourLoginController'); 
    } 
} 

這應該肯定是在控制器中。

您還可以創建一個基本控制器來擴展您的常規CI_Controller,在文檔中查找MY_Controller概念。在那裏,你可以添加,檢查認證,如果沒有重定向的方法,然後調用它在需要身份驗證的控制器方法:

class MY_Controller extends Controller{ 
    public $data = array(); 
    function _construct() { 
     parent::_construct(); 
     $data['logged_in'] = $this->session->userdata('logged_in'); 
    } 

    function authenticated() { 
     if (!$this->data['logged_in']) { 
      redirect('YourLoginController'); 
     } 
    } 
} 

然後在您的控制器:

class Some_Controller extends MY_Controller { 
    function _construct() { 
     parent::_construct(); 
    } 

    // If a method requires authentication 
    function someMethod() { 
     $this->authenticated(); //This does nothing if logged in 
           //It redirects to login if not logged in 
     //Your stuff. 
    } 

    //If a method DOESN'T require login, your $this->data to 
    //pass to the view has already been started from MY_Controller 
    //so append the display content you need to that array and 
    //then pass it to the view 
    function someOtherMethod() { 
     $this->data['somecontent'] = "I'm content"; 
     $this->load->view('someView',$this->data); 
    } 
} 

使用一個從someOtherMethod()創建的概念,你可以利用你的視圖中的變量$logged_in來根據用戶的身份驗證狀態更改內容。

2

那麼,視圖是用於表示邏輯的,在這種情況下,您應該將代碼保存在控制器中,但是如果它與視圖相關,例如,如果您有導航並且如果顯示記錄的不同菜單在用戶,那麼你可以在你的控制器

$loggedIn = $this->session->userdata('is_logged_in'); 
// .... 
$data['loggedIn'] = $loggedIn; 
$this->load->view('viewname', $data) 

使用和變量從控制器傳遞給視圖,然後在視圖中,您可以檢查

<?php if($loggedIn): ?> 
    // Show menu for logged in user 
<?php else: ?> 
    // Show a different menu 
<?php endif; ?> 

只保留一些loopsforeach卜生成菜單或在視圖中填充dropdown e.t.c和if語句(如果需要)。

0

儘管代碼可以在視圖和控制器文件中使用,但將代碼保存在控制器中不僅僅是爲了MVC哲學,而且將它保存在控制器中也更有效。

原因是您的視圖文件從控制器加載。這意味着如果用戶沒有登錄,您的控制器視圖文件仍然會被解釋,儘管他們不一定是。如果您在控制器中檢查會話,一旦控制器得知會話丟失,它可以停止解釋其餘的代碼並執行一些其他操作,例如將用戶重定向到不需要驗證的頁面。