檢查用戶是否登錄最安全的方法是什麼?我使用php的框架,codeigniter。檢查用戶是否登錄
$loggedIn = $this->session->userdata('is_logged_in'); // returns 1
if($loggedIn == true): ?>
// do something
<?php endif; ?>
這個代碼是在控制器還是在視圖中有關係嗎?
檢查用戶是否登錄最安全的方法是什麼?我使用php的框架,codeigniter。檢查用戶是否登錄
$loggedIn = $this->session->userdata('is_logged_in'); // returns 1
if($loggedIn == true): ?>
// do something
<?php endif; ?>
這個代碼是在控制器還是在視圖中有關係嗎?
代碼最好放置在控制器中,以便根據用戶是否登錄顯示正確的視圖。安全?你想要避免什麼?使用CI是檢查和查看用戶當前是否登錄的最常用方法...只要您正確設置is_logged_in
變量即可。
當您_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
來根據用戶的身份驗證狀態更改內容。
那麼,視圖是用於表示邏輯的,在這種情況下,您應該將代碼保存在控制器中,但是如果它與視圖相關,例如,如果您有導航並且如果顯示記錄的不同菜單在用戶,那麼你可以在你的控制器
$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; ?>
只保留一些loops
像foreach
卜生成菜單或在視圖中填充dropdown
e.t.c和if
語句(如果需要)。
儘管代碼可以在視圖和控制器文件中使用,但將代碼保存在控制器中不僅僅是爲了MVC哲學,而且將它保存在控制器中也更有效。
原因是您的視圖文件從控制器加載。這意味着如果用戶沒有登錄,您的控制器視圖文件仍然會被解釋,儘管他們不一定是。如果您在控制器中檢查會話,一旦控制器得知會話丟失,它可以停止解釋其餘的代碼並執行一些其他操作,例如將用戶重定向到不需要驗證的頁面。