【问题标题】:CodeIgniter authenticate the user in every ControllerCodeIgniter 在每个 Controller 中对用户进行身份验证
【发布时间】:2013-08-07 10:41:41
【问题描述】:

我正在 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/');  
        }
    }

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

提前致谢。

【问题讨论】:

    标签: php codeigniter authentication


    【解决方案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 了解更多信息。

    【讨论】:

    • 很好的答案,谢谢。 (所以现在说“避免像'谢谢'这样的cmets”,对此感到抱歉。)
    【解决方案2】:

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

    最好的,我认为最干净的方法是将它添加到每个功能标准中。这样,如果您想让每个人都公开该控制器功能,您始终可以对其进行编辑。

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

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

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

    【讨论】:

    • every function in every controller OP 说。为什么他不应该使用__construct() 方法?我错过了什么吗?
    • 如果 OP 将其放入例如构造中,他将无法在其控制器的公共功能中禁用该功能。如果他现在按照编码的方式进行操作,他就可以更好地控制要显示的内容和隐藏的内容。
    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 2013-03-11
    • 2013-04-17
    • 2021-06-11
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多