Code Igniter User Guide Version 1.5.2


Classe Sessão

A classe Sessão lhe permite manter um "status" do usuário e acompanhar sua atividade enquanto ele navega por seu site. A classe armazena as informações da sessão para cada usuário em dados dispostos em série (e opcionalmente criptografados) num cookie. Ela pode ainda armazenar os dados da sessão em uma tabela no banco de dados para aumentar a segurança, pois isto permite que a ID da sessão no cookie do usuário tenha ligação, e seja comparável, com o ID da sessão armazenada. Por default, apenas o cookie é salvo. Se você escolher usar a opção de banco de dados, precisará criar a tabela de sessão indicada abaixo.

Nota: A classe Sessão não utiliza as sessões nativas do PHP. Ela gera seus próprios dados de sessão, oferecendo maior flexibilidade para os desenvolvedores.

Inicializando a Sessão

Sessões irão tipicamente rodar globalmente em cada carregamento da página, portanto a classe sessão deve ser ou inicializada em seus construtores dos controllers, ou pode ser carregada automaticamente pelo sistema. Na maioria dos casos a classe sessão irá rodar despercebida no background, portanto sua simples inicialização a fará ler, criar e atualizar sessões.

Para inicializar a classe Sessão manualmente em seu controller, use a função $this->load->library:

$this->load->library('session');

Uma vez carregada, o objeto estará disponível usando: $this->session

Como as Sessões funcionam?

Quando uma página é carregada, a classe sessão irá checar se um dado válido de sessão existe no cookie de sessão do usuáiro. Se os dados de sessão não existirem (ou houverem expirados) uma nova sessão será criada e salva no cookie. Se a sessão já existir, sua informação e o cookie serão atualizados.

É importante que você entenda que uma vez inicializada, a classe Sessão roda automaticamente. Não há nada que você precise fazer para isto. Você pode, como verá abaixo, trabalhar com os dados de sessão ou mesmo adicionar seus próprios dados para a sessão do usuário, mas o processo de leitura, escrita e atualização da sessão é automático.

O que são os Dados da Sessão?

Uma sessão, no que tange à preocupação do Code Igniter, é simplesmente uma array contendo as seguintes informações:

Os dados acima são armazenados num cookie numa array em série, com este protótipo:

[array]
(
     'session_id'    => random hash,
     'ip_address'    => 'string - endereço IP do usuário',
     'user_agent'    => 'string - dados do User Agent do usuário',
     'last_activity' => horário,
     'last_visit'    => horário
)

Se você tiver habilitado a opção de criptografia, a array em séria será criptografada antes de ser armazenada num cookie, tornando os dados bem seguros e impossíveis de serem lidos ou alterados por alguém. Mais informações acerca da criptografia, podem ser encontradas aqui, no entanto a classe Sessão é responsável por inicializar e criptografar os dados automaticamente.

Nota: Cookies de sessão são atualizados apenas de 5 em 5 minutos, para reduzir a carga de processamento. Se você repetidamente recarregar a página, notará que o horário de "última atividade" será atualizado apenas se 5 minutos ou mais se passaram desde a última vez que o cookie foi escrito.

Recuperando os Dados de Sessão

Qualquer pedaço da informação vinda da array de sessão estará disponível através da função:

$this->session->userdata('item');

Onde item é o índice da array correspondente ao item que você deseja recuperar. Por exemplo, para recuperar a ID de sessão, você deve fazer isto:

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

Nota: A função retorna FALSO (booleano) se o item que você esta tentando acessar não existir.

Adicionando Dados de Sessão Personalizados

Um aspecto útil da array de sessão é que você pode adicionar seus próprios dados a ela, e ela os armazenará no cookie do usuário. Mas porque você gostaria de fazer tal coisa? Aqui vai um exemplo:

Digamos que um usuário em particular faça o login em seu site. Uma vez autenticado, você poderá adicionar seu nome de usuário e e-mail para o cookie de sessão, tornando os dados globalmente disponíveis sem precisar rodar uma query no banco quando precisar acessá-los.

Adicionar seus dados para a array de sessão envolve passar uma array, contendo seus novos dados, para esta função:

$this->session->set_userdata($array);

Onde $array é uma array associativa contendo seus novos dados. Aqui está um exemplo:

$novosdados = array(
                   'nome_de_usuario'  => 'fulano',
                   'e-mail'     => 'fulano@algum-site.com',
                   'esta_logado' => TRUE
               );

$this->session->set_userdata($novosdados);

Se você desejar adicionar dados do usuário em um valor por vez, set_userdata() também suporta esta sintaxe:

$this->session->set_userdata('alguma_coisa', 'algum_valor');

Nota: Cookies podem conter até 4KB de dados, por isto tenha cuidado em não exceder tal capacidade. O processo de criptografia, em particular, produz uma string de dados mais longa que a original, por isso mantenha controle de quantos dados você armazenará.

Salvando os dados de Sessão no Banco de Dados

A ID de sessão, contida da array respectiva, só pode ser validada se você a armazenar no banco de dados. Para as aplicações que requeiram pouca ou nenhuma segurança, a validação da ID de sessão pode ser necessária, mas se sua aplicação exigir segurança, a validação é obrigatória.

Quando os dados de sessão estão disponíveis no banco, toda vez que uma sessão válida for encontrada no cookie do usuário, uma query é executada para compará-los. Se a ID não bater, a sessão é destruída. As ID's não nunca podem ser atualizadas, podem apenas ser geradas quando uma nova sessão é criada.

Para armazenar sessões, você primeiro deve criar a tabela no banco para este propósito. Aqui vai um protótipo básico (para MySQL) requerido pela classe Sessão:

Nota: Por default, a tabela chama-se ci_sessions, mas você pode colocar qualquer nome que quiser, desde que atualize o arquivo application/config/config.php para que ele contenha o novo nome. Uma vez criada a tabela, você pode habilitar a opção de banco de dados em seu arquivo config.php como se segue:

$config['sess_use_database'] = TRUE;

Uma vez habilitada, a classe Sessão irá armazenar os dados de sessão no banco.

Tenha certeza de ter especificado o nome da tabela em seu arquivo de configuração:

$config['sess_table_name'] = 'ci_sessions";

Nota: A classe Sessão tem uma coleção lixeira embutida, que limpa as sessões expiradas, por isso você não precisa criar sua própria rotina para fazê-los.

Destruindo uma Sessão

Para limpar a sessão atual:

$this->session->sess_destroy();

Preferências de Sessão

Você encontrará as preferências relacionadas a Sessões em seu arquivo application/config/config.php:

Preferência Valor Default Opções Descrição
sess_cookie_name ci_sessionNenhum O nome para a sessão do cookie.
sess_expiration 7200 Nenhum O número de segundos que você quer que a sessão dure. O valor padrão é 2 horas (7.200 segundos). Se desejar uma sessão que não expire, use o valor zero: 0
sess_encrypt_cookie FALSE TRUE/FALSE (boolean) Se deve criptografar os dados da sessão.
sess_use_database FALSE TRUE/FALSE (boolean) Se deve salvar a sessão no banco. Você deve criar a tabela antes de habilitar esta opção.
sess_table_name ci_sessionsQualquer nome válido para uma tabela SQL O nome da tabela de sessão no banco.
sess_match_ip FALSE TRUE/FALSE (boolean) Se deve verificar o endereço IP do usuário ao ler os dados da sessão. Note que alguns ISPs dinamicamente alterar o IP, portanto se você quiser uma sessão que não expirer, deve usar FALSE.
sess_match_useragent TRUE TRUE/FALSE (boolean) Se deve verificar o User Agent do usuário ao ler os dados da sessão.