检查用户是否已登录的最安全方法是什么?我正在使用php的框架,codeigniter。
$loggedIn = $this->session->userdata('is_logged_in'); // returns 1
if($loggedIn == true): ?>
// do something
<?php endif; ?>
此代码是在控制器中还是在视图中是否重要?
答案 0 :(得分: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; ?>
仅保留一些loops
foreach
来构建菜单或在视图中填充dropdown
e.t.c和if
语句(如果需要)。
答案 1 :(得分: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 :(得分:0)
代码最好放在控制器中,以便根据用户是否登录显示正确的视图。安全?你想避免什么?使用CI这是检查和查看用户当前是否已登录的最常用方法...只要您正确设置is_logged_in
变量。
答案 3 :(得分:0)
虽然代码在视图和控制器文件中都可以工作,但是将代码保存在控制器中不仅仅是为了MVC哲学,更好的做法,但是将它保存在控制器中也更有效。
原因是您的视图文件是从控制器加载的。这意味着如果用户未登录,您的控制器和视图文件仍将被解释,尽管他们不必这样做。如果您在控制器中检查会话,一旦控制器得知会话丢失,它就可以停止解释其余代码并执行一些其他操作,例如将用户重定向到不需要身份验证的页面。