CodeIgniter在每个Controller中验证用户身份

时间:2013-08-07 10:41:42

标签: php codeigniter authentication

我正在Codeigniter中构建我的第一个项目,使用 Tank_auth 来处理我的CMS身份验证。

它工作正常,但我对最佳做法有疑问。目前,每个控制器中的每个功能都具有以下结构:

public function add()
    {
        if ($this->tank_auth->is_logged_in())
        {

            $data['stuff'] = 'stuff';

            $this->load->view('admin/cms_add',$data);


        } else
        {
            redirect('/admin/login/');  
        }
    }

有很多控制器,每个都有一些功能,它开始变得重复,我想知道这是否是正确的方法,或者是否有更简洁的方法来确保未登录的用户可以不能访问这些功能。

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果every method in every controller应检查用户是否已登录,则可以在每个控制器中使用__construct()方法,如下所示:

public function __construct()
{
    parent::__construct();

    if (! $this->tank_auth->is_logged_in()) {
        redirect('/admin/login/');
    }
}

您还可以扩展CI控制器并创建自定义MY_Controller并检查内部的if语句。然后控制器只接受登录用户,应该继承My_Controller

application/core/MY_Controller.php

class MY_Controller extends CI_Controller {

    public function __construct()
    {
        // Execute CI_Controller Constructor
        parent::__construct();

        if (! $this->tank_auth->is_logged_in()) {
            redirect('/admin/login/');
        }
    }
}

application/controllers/welcome.php

class Welcome extends MY_Controller {

    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        $this->load->view('welcome_message');
    }
}

请查看CI user guide了解详情。

答案 1 :(得分:0)

我也是这样做的。没有更好的方法,因为您可以拥有对于未登录用户可见的控制器,您无法将其添加到构造函数或其他内容。

最好的,在我看来最干净的方法是将它添加到每个功能标准中。这样,如果您希望为每个人公开该控制器功能,您始终可以编辑它。

不允许任何人使用的功能可以设置为私有。

private function add()
    { 
         // do private stuff
    }

所以你最好使用当前代码:)