我正在尝试使用codeigniter构建一个基本的登录脚本,但有些东西我不明白...
如何在您登录后,仅在您登录后初始化会话?
您是否必须在成员区域的每个构造函数中放置$this->load->library('sessions')
?
答案 0 :(得分:7)
将会话类置于application/config/autoload.php
:
$autoload['libraries'] = array('session' /* , ... */);
然后它在每个控制器中自动可用:
$session_id = $this->session->userdata('session_id');
并且您可以在每次登录之后(并且仅在!之后)初始化会话数据。
它被称为session
而不是sessions
。因此,如果您不想自动加载(不自动加载会话库没有多大意义,但无论如何,做你想做的事情),使用正确的库名称使其工作;)
答案 1 :(得分:2)
最好的方法是创建自己的扩展CI_Controller的Controller类。
基本上当你说:
class Controller_name extends CI_Controller {}
您可以将其更改为
class Controller_name extends My_Controller {}
My_Controller将进行身份验证,如果页面不需要用户登录,则使用标准CI_Controller类。
更新:
我在工作中写了这篇文章,没有代码示例来更好地展示这一点。
在MY_Controller.php
中创建/applications/core/
并使用以下代码。
<?php
class MY_Controller extends CI_Controller {
function __construct() {
parent::__construct();
// Verify logged in status.
if ( ! $this->session->userdata('loggedIn') ) redirect('/login');
}
}
然后在login
控制器中设置一个名为loggedIn
的会话变量。我通常会将此值设为用户ID,以便我快速参考。
现在,如果您想让任何控制器要求用户登录,请扩展您的新MY_Controller类。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Dashboard extends MY_Controller {
/* Your Code */
}
如果用户没有loggedIn
作为会话变量,那么他们将被重定向到login
控制器。
希望这有帮助。
答案 2 :(得分:2)
自动加载Codeigniter会话时要小心,特别是如果您使用MySQL作为高负载网站的会话存储。除了显而易见的减速(最终)读/写活动外,Codeigniter总是会给机器人,特别是谷歌机器人。根据您自己在Google网站站长工具中的网站设置,这可能会导致性能下降。
我发现会话存储的最有效方式是Memcache。我尝试过MongoDB,但这有时会带来更多弊大于利。我使用位于here的Codeigniter的Memcache打开了我自己的会话管理。
Memcache有自己的内部垃圾收集器方式比Codeigniter更强大,因此您不必担心存储的大小。如果需要,您可以简单地增加Memcache内存大小。我建议~4GB用于高负荷网站,每秒并发请求超过100个。
祝你好运!答案 3 :(得分:0)
您可以创建一个新的控制器类,它将扩展“CI_controller”。您需要使用“MY_”前缀对其进行命名,并将其放入“/ system / application / libraries /”文件夹中。在自定义控制器的构造中,您可以启动会话。如果您的控制器需要auth,则扩展自定义类,否则扩展“CI_controller”类。
答案 4 :(得分:0)
我喜欢使用库来处理与会话数据的所有交互。将库添加到自动加载配置中,您可以根据需要从代码中的任何位置引用它。
我建议您查看现有的身份验证库(例如Ion_Auth - 我最喜欢的起点),然后从那里构建或决定可以将哪些经验教训应用于您自己的需求。