如何在codeigniter中设置持久登录?

Posted

技术标签:

【中文标题】如何在codeigniter中设置持久登录?【英文标题】:How to setup persistent logins in codeigniter? 【发布时间】:2013-09-16 14:36:56 【问题描述】:

我是 codeigniter 框架的新手,我很好奇如何设置流程来处理持久登录。我正在将现有网站迁移到 codeigniter,一切都已经设置好,包括创建 cookie、保存和更新数据库中的令牌,这是持久登录的平均最佳实践。

由于我是 codeigniter 新手,我不确定如何处理用户系统上的 cookie 检查?在旧应用程序中,我编写了一个名为“create_user_session()”的函数,我在站点上每个页面的顶部调用它。此会话检查用户是否已登录,如果没有,则检查用户计算机上是否存在 cookie,如果存在,则使用 cookie 中的令牌使用户登录。

我的问题是我应该在 codeigniter 的哪个位置设置这个过程?我假设有一种方法可以处理这种情况,而不必在我的每个控制器中调用“create_user_session()”函数……至少这是我所希望的。非常感谢任何有关如何处理这种情况的见解! :)

*编辑 我计划有一个“会话”控制器,用于处理访问用户登录、注销、注册用户、删除用户等所需的模型。

【问题讨论】:

你看过会话库吗? ellislab.com/codeigniter/user-guide/libraries/sessions.html 我刚刚通读了该文档,如果我理解正确,一旦您自动加载会话类 codeigniter,然后知道在请求页面时执行会话处理任务?如果是这种情况,那么我应该扩展会话类以利用我的持久登录功能吗? 查看答案。我建议扩展控制器而不是会话库。 【参考方案1】:

假设您的“持久登录功能”只是自动登录具有 cookie/会话的用户,CodeIgniter 的会话库将为您处理这个问题。

如果您自动加载会话库,CI 将在每次页面加载时更新会话。

为了检查页面加载时的会话,您可以在控制器构造函数中、控制器方法中进行检查,或者您可以创建一个扩展控制器来为您全面执行此操作——这可能是最简单的并做出最有意义的事情。

application/core/MY_Controller.php

class MY_Controller extends CI_Controller
    public function __construct() 
        parent::__construct();
        if($this->session->userdata('session_id') == FALSE) 
            redirect('/login');
        
    

控制器:

需要身份验证:

application/controllers/Whatever.php

class Whatever extends MY_Controller 

    // have to be logged in to see anything in here

   

不需要身份验证:

application/controllers/Login.php

class Login extends CI_Controller

    // don't have to be logged in to see stuff here since
    // we're extending CI_Controller and not MY_Controller


【讨论】:

__construct() 方法是否应该包含“parent::construct();”?我正在将您的答案与 jonixj 的答案进行比较,我看到他在扩展类时调用 CI_Controller 方法的构造方法,然后在扩展它的每个控制器中调用扩展类的构造方法? 是的,对不起。把它扔在那里,否则 CI 的其余部分将不可用:/ 除非您想为该控制器创建自己的构造函数,否则您不需要控制器中的function __construct()。见ellislab.com/codeigniter/user-guide/general/…【参考方案2】:

您应该在核心目录中创建一个 MY_Controller.php 并让应用程序中的所有控制器都从该控制器扩展,而不是检查每个控制器中的 cookie。

这对于身份验证以及您不想在整个应用程序中重复的许多其他内容非常方便。

例如:

文件:core/MY_Controller.php

class MY_Controller extends CI__Controller 
    function construct()
    
        parent::construct();
        create_user_session();
    

然后让你所有的控制器都从你的 MY_Controller 而不是 CI_Controller 扩展:

class Users extends MY_Controller 
    function construct()
    
        parent::construct();
        [...]
    

    [...]
 

【讨论】:

以上是关于如何在codeigniter中设置持久登录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在codeigniter中设置403错误自定义html页面

在 Codeigniter 中设置表单的“名称”属性

在codeigniter中的数据库中设置值时如何将复选框显示为选中状态

如何在CodeIgniter中设置动态路由以使用slug?

codeigniter 自定义 404 页面不起作用

如何在 Android 中设置持久/定期计划?