2011-11-09 61 views
2

我試圖建立與笨一個基本的登錄腳本,但有件事情我不明白......瞭解笨會議

你如何初始化後的會話,只有後,你已經登錄?

您是否必須將$this->load->library('sessions')放入成員區的每個構造函數中?

IM失去了:P

回答

7

把會話類到磁帶自動加載機的配置,在application/config/autoload.php

$autoload['libraries'] = array('session' /* , ... */); 

然後在每個控制器的自動可用:

$session_id = $this->session->userdata('session_id'); 

,你可以初始化後的會話數據(只有經過!)每次登錄。

它叫做session而不是sessions。所以如果你不想自動加載(而不是自動加載會話庫,但無論如何,做你想做的),使用正確的庫名稱使其工作;)

+0

其他一些答案比較好,因爲除非你正在創建一個需要登錄的站點(例如gmail),否則即使沒有登錄的用戶也會無緣無故地進行會話。 –

2

這樣做是爲了創建一個擴展是CI_Controller自己的控制器類的最佳方式。

基本上當你說:

class Controller_name extends CI_Controller {} 

你會改變,要

class Controller_name extends My_Controller {} 

的My_Controller會做身份驗證,如果一個頁面不要求用戶在使用中記錄標準的CI_Controller類。

UPDATE:

我寫了這個工作,並沒有足夠的代碼示例確實顯示這更好。

創建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控制器。

希望這會有所幫助。

0

您可以創建一個新的控制器類來擴展「CI_controller」。您需要使用「MY_」前綴命名並將其放入「/ system/application/libraries /」文件夾中。在你的自定義控制器的構造中,開始會話。如果您的控制器需要授權,則擴展自定義類,否則擴展「CI_controller」類。

0

我很喜歡使用庫來處理與會話數據的所有交互。將庫添加到自動加載配置中,並且可以根據需要從代碼中的任何位置引用它。

我建議考慮一下現有的認證庫(例如Ion_Auth-我最喜歡的起點),並從那裏開發或決定哪些經驗教訓可以應用於您自己的需求。

2

是自動加載Codeigniter會話時要小心,特別是如果您使用MySQL作爲高負載網站的會話存儲。除了明顯的放緩(最終)讀/寫活動外,Codeigniter將始終將會話授予機器人,特別是Google Bots。根據您在Google網站站長工具中自己的網站設置,這可能會導致性能下降。

我發現會話存儲的最有效方式是Memcache。我試過MongoDB,但這有時也會帶來更多的傷害。我打開使用位於here的Codeigniter的Memcache使用我自己的會話管理。

Memcache有自己的內部垃圾收集器方式比Codeigniter更強大,因此您不必擔心存儲空間的大小。如果需要,可以簡單地增加Memcache內存大小。我建議~4GB的高負載網站,每秒超過100個併發請求。

祝你好運!