5

检查用户是否登录的最安全方法是什么?我正在使用php的框架,codeigniter。

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

这段代码是在控制器中还是在视图中是否重要?

4

4 回答 4

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等和if语句(在需要时)。

于 2013-05-17T01:45:34.000 回答
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视图中的变量来根据用户的身份验证状态更改内容。

于 2013-05-17T01:38:15.127 回答
0

代码最好放在控制器中,这样您就可以根据用户是否登录来显示正确的视图。安全的?你想避免什么?使用 CI,这是检查用户当前是否登录的最常用方法……只要您is_logged_in正确设置变量。

于 2013-05-17T01:36:50.377 回答
0

虽然代码可以在视图文件和控制器文件中工作,但将代码保存在控制器中是一个更好的主意,这不仅是为了 MVC 理念,而且将其保存在控制器中也更有效。

原因是您的视图文件是从控制器加载的。这意味着如果用户未登录,您的控制器和视图文件仍将被解释,尽管它们并非必须如此。如果您在控制器中检查会话,一旦控制器得知会话丢失,它就可以停止解释其余代码并执行一些其他操作,例如将用户重定向到不需要身份验证的页面。

于 2013-05-17T03:05:52.600 回答