Garantir a segurança da aplicação é essencial, principalmente quando há uma área administrativa onde usuários autenticados podem gerenciar conteúdos sensíveis. Neste post, vamos implementar melhorias no controle de acessos e reforçar a proteção do sistema.
Protegendo a Área Administrativa com Middleware
Já utilizamos um filtro para restringir o acesso à área administrativa. No entanto, podemos reforçar esse controle criando um middleware personalizado. No diretório app/Filters/
, crie um arquivo chamado AuthFilter.php
:
namespace App\Filters;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;
class AuthFilter implements FilterInterface
{
public function before(RequestInterface $request, $arguments = null)
{
if (!session()->get('usuario_logado')) {
return redirect()->to('/login')->with('erro', 'Você precisa estar logado para acessar esta página.');
}
}
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
{
// Nenhuma ação necessária após a requisição
}
}
Agora registramos esse filtro no arquivo app/Config/Filters.php
:
public $filters = [
'auth' => ['before' => ['admin/*']],
];
Isso garante que todas as rotas dentro do grupo /admin
exijam autenticação.
Implementando Controle de Permissões
Nem todos os usuários administrativos devem ter o mesmo nível de acesso. Para implementar um sistema de permissões, adicionamos uma coluna role
à tabela de usuários.
Crie uma nova migration:
php spark migrate:create AddRoleToUsers
Edite o arquivo gerado em app/Database/Migrations/
e adicione:
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class AddRoleToUsers extends Migration
{
public function up()
{
$this->forge->addColumn('usuarios', [
'role' => ['type' => 'ENUM', 'constraint' => ['admin', 'editor'], 'default' => 'editor'],
]);
}
public function down()
{
$this->forge->dropColumn('usuarios', 'role');
}
}
Execute a migração:
php spark migrate
Agora, no AuthFilter.php
, podemos verificar permissões:
if (session()->get('usuario_role') !== 'admin') {
return redirect()->to('/')->with('erro', 'Acesso negado.');
}
Protegendo Ações Sensíveis com CSRF
O CodeIgniter 4 protege formulários contra CSRF (Cross-Site Request Forgery) automaticamente. Para garantir que todas as requisições POST sejam seguras, ative essa proteção no app/Config/App.php
:
public $CSRFProtection = true;
Nos formulários, adicione csrf_field()
para gerar o token CSRF:
<form action="<?= site_url('admin/posts/criar') ?>" method="post">
<?= csrf_field() ?>
<label>Título:</label>
<input type="text" name="titulo" required><br>
<button type="submit">Salvar</button>
</form>
Isso protege a aplicação contra requisições maliciosas.
Reforçando a Segurança das Senhas
Ao armazenar senhas no banco de dados, nunca devemos salvá-las em texto plano. O CodeIgniter 4 oferece o password_hash()
para criptografar senhas:
$senhaHash = password_hash($this->request->getPost('senha'), PASSWORD_DEFAULT);
Para validar a senha durante o login:
if (password_verify($senhaDigitada, $usuario['senha'])) {
session()->set('usuario_logado', $usuario['id']);
}
Conclusão
Com essas melhorias, nossa aplicação está mais protegida contra acessos indevidos e ataques comuns. No próximo post, podemos aprofundar mais sobre logs de segurança e auditoria no CodeIgniter 4.
Se você ou sua empresa precisa de suporte para reforçar a segurança do seu projeto com CodeIgniter 4, a Saldaris Consultoria pode ajudar. Entre em contato pelo formulário no final da página para saber mais sobre nossos serviços.