Como configurar uma sessão em CodeIgniter com exemplo

⚡ Resumo Inteligente

CodeO gerenciamento de sessão do Igniter armazena dados do usuário em requisições HTTP sem estado, permitindo que um aplicativo se lembre de um usuário conectado, itens no carrinho ou mensagens flash únicas. Este exemplo cria mensagens flash e um login simulado usando o CodeBiblioteca de sessão Igniter.

  • 🌐 Por que as sessões: O HTTP não mantém estado, portanto as sessões preservam os dados do usuário, como o estado de login, entre diferentes solicitações de página no servidor.
  • 🍪 Cookies vs. Sessões: Os cookies armazenam pequenos dados no computador do usuário, enquanto as sessões armazenam dados maiores no servidor e são mais seguras para valores sensíveis.
  • ???? Dados Flash: A função set_flashdata() armazena uma mensagem que estará disponível apenas na próxima requisição, ideal para fornecer feedback único após um redirecionamento.
  • 🔑 Dados do usuário: A função set_userdata() mantém valores como nome de usuário e login ativo durante toda a sessão, e a função unset_userdata() os apaga ao sair da sessão.
  • 🛡️ Controle de acesso: Um método reutilizável check_auth() redireciona os visitantes para a página de login sempre que a chave de sessão logged_in estiver ausente.
  • 🧪 Exemplo de trabalho: O tutorial conecta rotas, um controlador e visualizações no estilo Bulma para demonstrar fluxos de sessão tanto em flash quanto persistentes.
  • 🤖 Assistência de IA: As ferramentas de IA podem estruturar controladores de sessão, gerar mapas de rotas e sinalizar o tratamento inseguro de sessões antes da implantação.

CodeGerenciamento de Sessão Igniter

CodeGerenciamento de Sessão Igniter

Se você já desenvolveu aplicativos para desktop, provavelmente sabe que é possível definir uma variável global, atribuir um valor a ela e usá-la durante todo o ciclo de vida do aplicativo. Ao abrir e fechar mais de um formulário, cada requisição terá acesso à variável global.

Em outras palavras, o estado da aplicação é mantido. Ou seja, se ao fazer login você definiu o nome da empresa para uma variável global, então mesmo depois de fechar o formulário de login, esse estado do nome da empresa será preservado.

O HTTP funciona de maneira um pouco diferente do cenário que acabamos de descrever. Ele não mantém estado. Ou seja, o que você fizer em uma requisição não persiste na próxima.

Para contornar esse problema, temos duas (2) soluções em PHP. Podemos trabalhar com cookies, que são pequenos arquivos colocados no computador do usuário, ou trabalhar com sessões, que são semelhantes aos cookies, mas são armazenadas no servidor e têm uma capacidade maior do que os cookies.

Quando usar sessões?

As sessões são geralmente úteis quando você deseja acompanhar as atividades do usuário de página para página. Por exemplo, imagine que você tenha uma área protegida no site. Os usuários não precisam fazer login em cada página. Você pode permitir que o usuário faça login uma única vez e armazenar seus dados em uma variável de sessão, reutilizando esses mesmos dados em solicitações futuras. Outros casos de uso incluem o desenvolvimento de uma loja virtual.ping sistema e o usuário precisa adicionar itens à lojaping carrinho.

Alternativamente, CodeO Igniter também usa sessões para disponibilizar os dados apenas uma vez na próxima requisição. Isso é útil quando você edita e atualiza um registro no banco de dados e deseja retornar algum feedback ao usuário quando ele for redirecionado para outra página.

Envio de mensagens Flash para outras páginas com sessões de CI

Nesta seção, você aprenderá como enviar mensagens flash para outras páginas usando a biblioteca de sessões no CodeIgnorar.

Crie um novo arquivo SessionController em

application/controllers/SessionController.php

Adicione o seguinte código

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class SessionController extends CI_Controller {

public function __construct() {
parent:: __construct();

$this->load->helper('url');
$this->load->library('session');
}

public function index() {

$this->load->view('sessions/index');
}

public function flash_message(){
$this->session->set_flashdata('msg', 'Welcome to CodeIgniter Flash Messages');
redirect(base_url('flash_index'));
}
}

AQUI,

  • class SessionController estende CI_Controller {…} define a classe SessionController e estende a classe do controlador pai.
  • função pública __construct() {…} define o método construtor que inicializa a classe pai e carrega o auxiliar de url e a biblioteca de sessão.
  • public function index() {…} define o método de índice de sessão que carrega a visualização do índice de sessão.
  • função pública flash_message(){…} define o método de mensagem flash que define os dados flash e então redireciona para a rota flash_index

Vamos agora criar a visualização que exibirá o valor dos dados da sessão.

Crie um novo diretório de sessões em application/views

Crie um novo arquivo index.php em application/views/sessions

Adicione o seguinte código

<html>
<head>
<title>Code Igniter Flash Session</title>
</head>
<body>
<p>The session value of msg is <b> <?= $this->session->userdata('msg');?> </b></p>
</body>
</html>

AQUI,

session->userdata('msg');?> recupera o valor dos dados da sessão com a chave 'msg' e o exibe no navegador.

Vamos agora criar as rotas para o nosso método flash de sessão.

Abra application/config/routes.php

Adicione as seguintes linhas

$route['flash_index'] = 'sessioncontroller';
$route['flash_message'] = 'sessioncontroller/flash_message';

Vamos agora iniciar o servidor integrado para PHP e teste nossas mensagens flash

Abra o terminal

Execute o seguinte comando

cd C:\Sites\ci-app
php -S localhost:3000

AQUI,

O comando acima navega até o diretório do código do aplicativo e inicia o servidor integrado na porta 3000.

Observação: o caminho do aplicativo deve corresponder ao caminho onde você o baixou. CodeIgniter, e você pode usar qualquer número de porta livre no seu computador. Não é necessário usar a porta 3000.

Carregue o seguinte URL No seu navegador web: http://localhost:3000/flash_message

Você será redirecionado para o seguinte URLE você obterá os seguintes resultados: http://localhost:3000/flash_index

Envio de mensagens Flash para outras páginas

Clique no botão atualizar do seu navegador ou pressione F5

Agora você obterá os seguintes resultados

Envio de mensagens Flash para outras páginas

Armazenando dados do usuário em sessões de CI

Vejamos agora um exemplo um pouco mais avançado. Para simplificar, simularemos a autenticação do usuário, sem implementar a verificação do registro do usuário no banco de dados e da senha enviada.

Vamos começar com as rotas.

Abra rotas.php localizado em application/config

Adicione as seguintes rotas

$route['login'] = 'sessioncontroller/login';
$route['authenticate'] = 'sessioncontroller/authenticate';
$route['settings'] = 'sessioncontroller/settings';
$route['dashboard'] = 'sessioncontroller/dashboard';
$route['logout'] = 'sessioncontroller/logout';

AQUI,

  • $route['login'] = 'sessioncontroller/login'; define a rota que exibe o formulário de login
  • $route['authenticate'] = 'sessioncontroller/autenticar'; define a rota que simula o login bem-sucedido do usuário e define os dados de login da sessão.
  • $route['settings'] = 'sessioncontroller/settings'; define uma página protegida que só deve ser acessível a usuários logados
  • $route['dashboard'] = 'sessioncontroller/dashboard'; define uma página protegida que só deve ser acessível a usuários logados.
  • $route['logout'] = 'sessioncontroller/logout'; desconecta o usuário destruindo os dados da sessão

Vamos agora atualizar o SessionController.

Abra application/controllers/SessionController.php

Adicione os seguintes métodos

public function check_auth($page) {
if (!$this->session->userdata('logged_in')) {
$this->session->set_flashdata('msg', "You need to be logged in to access the $page page.");
redirect('login');
}
}

public function login() {
$this->load->view('sessions/login');
}

public function authenticate() {
$this->session->set_userdata('username', 'John Doe');
$this->session->set_userdata('logged_in', TRUE);
redirect(base_url('dashboard'));
}

public function dashboard() {
$this->check_auth('dashboard');
$this->load->view('sessions/dashboard');
}

public function settings() {
$this->check_auth('settings');
$this->load->view('sessions/settings');
}

public function logout() {
$this->session->unset_userdata('username');
$this->session->unset_userdata('logged_in');
redirect(base_url('login'));
}

AQUI,

  • A função pública `check_auth($page) {…}` define o método que verifica se o usuário está autenticado e, em caso afirmativo, permite o acesso à página. Se o usuário não estiver autenticado, ele será redirecionado para a página de login com uma mensagem flash.
  • public function login() {…} carrega a view de login localizada no diretório de sessões.
  • public function authenticate() {…} define os dados do usuário da sessão para as chaves logado_in e nome de usuário. NOTA: Não estamos verificando nenhum detalhe de login no banco de dados. Estamos simplesmente assumindo que os detalhes enviados estão corretos e definimos os dados da sessão.
  • public function dashboard() {…} carrega a página do painel após chamar $this->check_auth('dashboard'); que verifica se a chave de sessão logged_in está definida.
  • public function settings() {…} carrega a página de configurações, que também é protegida
  • public function logout() {…} destrói os dados da sessão e desconecta o usuário. O método também redireciona para a página de login

CodeVisualizações de sessão do Igniter

Crie as seguintes visualizações em application/views/sessions

  • painel.php
  • login.php
  • settings.php

Adicione o seguinte código ao dashboard.php

<!DOCTYPE html>
<html>
<head>
<title>Dashboard</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https:0
</head>
<body>
<div class="container">
<div class="column">
<nav class="navbar" role="navigation" aria-label="main navigation">
<div id="navbarBasicExample" class="navbar-menu">
<div class="navbar-start">
<a href="<?= site_url('dashboard')?>" class="navbar-item is-active">Dashboard</a>
<a href="<?= site_url('settings')?>" class="navbar-item">Settings</a>
</div>
 
<div class="navbar-end">
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link"><?=$this->session->userdata(3);?></a>
 
<div class="navbar-dropdown">
<a class="navbar-item">My Profile</a>
<hr class="navbar-divider">
<a class="navbar-item">Sign out</a>
</div>
</div>
</div>
</div>
</nav>
<h3>Welcome Page</h3>
</div>
</div>
</body>
</html>

AQUI,

session->userdata('username');?> exibe o nome de usuário que definimos no método de autenticação

Adicione o seguinte código ao login.php

<!DOCTYPE html>
<html>
<head>
<title>Login</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https:0
</head>
<body>
<div class="container">
<div class="column">
<p><?=$this->session->userdata(1);?></p>
<form method="post" action="<?= site_url('authenticate')?>">
<div class="field">
<label class="label">Username</label>
<div class="control">
<input class="input" type="text" placeholder="Text input">
</div>
</div>
<div class="field">
<label class="label">Password</label>
<div class="control">
<input class="input" type="password" placeholder="Text input">
</div>
</div>
<div class="field is-grouped">
<div class="control">
<button class="button is-success">Login</button>
</div>
</div>
</form>
</div>
</div>
</body>
</html>

AQUI,

O formulário de login é enviado para a rota de autenticação.

Adicione o seguinte código em settings.php

<!DOCTYPE html>
<html>
<head>
<title>Settings</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https:0
</head>
<body>
<div class="container">
<div class="column">
<nav class="navbar" role="navigation" aria-label="main navigation">
<div id="navbarBasicExample" class="navbar-menu">
<div class="navbar-start">
<a href="<?= site_url('dashboard')?>" class="navbar-item">Dashboard</a>
<a href="<?= site_url('settings')?>" class="navbar-item">Settings</a>
</div>
 
<div class="navbar-end">
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Jim Jones</a>
 
<div class="navbar-dropdown">
<a href="#" class="navbar-item">My Profile</a>
<hr class="navbar-divider">
<a href="<?= site_url('logout')?>" class="navbar-item">Sign out</a>
</div>
</div>
</div>
</div>
</nav>
<h3>Settings Page</h3>
</div>
</div>
</body>
</html>

Por hoje é só. Vamos agora testar nossa aplicação.

Neste tutorial, estamos usando o servidor web PHP integrado, mas você pode usar qualquer servidor web que suporte PHP.

Abra o terminal

Execute o seguinte comando

cd C:\Sites\ci-app
php -S localhost:3000

AQUI,

O comando acima navega até o diretório do código do aplicativo e inicia o servidor integrado na porta 3000.

Observação: o caminho do aplicativo deve corresponder ao caminho onde você o baixou. CodeIgniter, e você pode usar qualquer número de porta livre no seu computador. Não é necessário usar a porta 3000.

Abra o seguinte URL No seu navegador web: http://localhost:3000/dashboard

Você será redirecionado para a seguinte página.

CodeVisualizações de sessão do Igniter

Clique no botão Entrar

Você verá os seguintes resultados

CodeVisualizações de sessão do Igniter

Depois de fazer login, agora podemos ver os dados da sessão.

Perguntas Frequentes

Os dados do usuário persistem durante toda a sessão até que você os remova ou a sessão expire. Os dados flash são um valor temporário que sobrevive apenas à próxima solicitação e é removido automaticamente em seguida, o que é adequado para mensagens de uso único.

Tempdata são dados de sessão com um tempo de expiração definido. Você chama mark_as_temp() ou set_tempdata() com um tempo de vida em segundos, após o qual CodeO Igniter remove o valor automaticamente, mesmo que a sessão ainda esteja ativa.

Por padrão CodeO Igniter armazena sessões usando arquivos no servidor. Você pode alternar o driver para banco de dados, Redis ou Memcached no arquivo de configuração quando precisar de armazenamento compartilhado entre vários servidores.

Sim. A IA pode analisar a configuração da sua sessão em busca de configurações vulneráveis, recomendar a regeneração do ID da sessão após o login, ativar a criptografia de cookies e usar cookies somente HTTPS para reduzir os riscos de sequestro de sessão.

Sim. Com uma breve descrição, a IA pode gerar as rotas, um controlador de sessão e as visualizações protegidas. É sempre importante adicionar verificação real do banco de dados e hash de senha, já que os scaffolds de IA frequentemente usam verificações simuladas.

Resuma esta postagem com: