================================================================================ PROBLEMAS DE AUTENTICAÇÃO E AUTORIZAÇÃO - SISTEMA FREEFI ADMIN ================================================================================ Data: 2025-11-17 Ambiente: Produção (http://172.233.21.57:8082) Container Docker: freefi-8082 Database: mysql-3306 (container) ================================================================================ 1. PROBLEMA PRINCIPAL ================================================================================ ERRO: 403 Unauthorized ao tentar aprovar/editar usuários como SuperAdmin URL com erro: http://172.233.21.57:8082/users/6/approve Mensagem: "403 This action is unauthorized." Usuário: SuperAdmin autenticado Persistência: Erro continua mesmo após todas as correções aplicadas ================================================================================ 2. HISTÓRICO CRONOLÓGICO DO PROBLEMA ================================================================================ 2.1. DESCOBERTA INICIAL - Usuário reportou que ao tentar editar usuário ID 6, recebia erro 403 - Mesmo sendo SuperAdmin, não conseguia aprovar cadastros - URL: http://172.233.21.57:8082/users/6/edit 2.2. PRIMEIRA INVESTIGAÇÃO - Banco de Dados Incorreto - Descobrimos que Laravel estava conectado ao banco ERRADO - Container conectava em: mysql8-3308 (banco vazio, 0 usuários) - Deveria conectar em: mysql-3306 (banco produção, 5 usuários) CAUSA: Variáveis de ambiente do Docker sobrescreviam .env - Docker tinha: DB_HOST=mysql8-3308 - .env tinha: DB_HOST=127.0.0.1 CORREÇÃO APLICADA: - Modificado .env para: DB_HOST=mysql-3306, DB_PORT=3306 - Executado: docker-compose down && docker-compose up -d - RESULTADO: Laravel agora conecta no banco correto 2.3. SEGUNDO PROBLEMA - Bug no PublicClienteRegisterController - Arquivo: app/Http/Controllers/PublicClienteRegisterController.php - Linha 74 tinha: 'franquia_id;' => $empresa->id (TYPO) - Deveria ser: 'empresa_id' => $empresa->id IMPACTO: Usuários cadastrados via link público não tinham empresa associada CORREÇÃO APLICADA: - Corrigido o campo de 'franquia_id;' para 'empresa_id' - Removido ponto-e-vírgula no nome do campo 2.4. TERCEIRO PROBLEMA - Permissões de SuperAdmin - Verificamos que todos os 5 usuários já tinham is_superadmin = 1 - Mas o Gate::before não estava configurado em AppServiceProvider CORREÇÃO APLICADA: - Adicionado Gate::before em app/Providers/AppServiceProvider.php: ```php Gate::before(function ($user, $ability) { if ($user->is_superadmin) { return true; // SuperAdmin pode tudo } }); ``` 2.5. LIMPEZA DE CACHES (Múltiplas tentativas) Executados os seguintes comandos: - php artisan config:clear - php artisan route:clear - php artisan cache:clear - php artisan view:clear - php artisan optimize:clear - Deletado manualmente: storage/framework/sessions/* - Deletado manualmente: storage/framework/views/*.php 2.6. RESULTADO ATUAL ❌ ERRO 403 PERSISTE mesmo após todas as correções ================================================================================ 3. CONFIGURAÇÃO ATUAL DO SISTEMA ================================================================================ 3.1. BANCO DE DADOS (mysql-3306) Usuários cadastrados: 5 | ID | Name | Email | is_superadmin | |----|-------|-----------------------------------|---------------| | 1 | Cloud | linuxewireless@gmail.com | 1 | | 2 | Cloud | cloud@penseonline.com.br | 1 | | 3 | Joao | joao@gmail.com | 1 | | 4 | Cloud | teste@gmail.com | 1 | | 5 | Cloud | operacional@sistemasdistribuidos | 1 | ⚠️ IMPORTANTE: Usuário ID 6 NÃO EXISTE no banco de dados! 3.2. ARQUIVO DE ROTAS (routes/web.php) Middleware de SuperAdmin (linha 118): ```php Route::middleware('superadmin')->group(function () { Route::resource('empresas', EmpresaController::class); // ... }); ``` Middleware de Franquia para Clientes (linha 138): ```php Route::middleware(['franchise', 'throttle:60,1'])->prefix('clientes')->name('clientes.')->group(function () { Route::post('/{cliente}/approve', [ClienteController::class, 'approve'])->name('approve'); Route::post('/{cliente}/reject', [ClienteController::class, 'reject'])->name('reject'); // ... }); ``` Rotas de Usuários (linha 102-106): ```php Route::middleware(['auth', 'check.approval', 'check.empresa.aprovada'])->group(function () { Route::patch('users/{user}/approve', [UserController::class, 'approve'])->name('users.approve'); Route::patch('users/{user}/reject', [UserController::class, 'reject'])->name('users.reject'); Route::resource('users', UserController::class); }); ``` 3.3. POLÍTICAS DE AUTORIZAÇÃO (app/Policies/UserPolicy.php) Método approve (linha 135): ```php public function approve(User $user): bool { return $user->is_superadmin; } ``` ✅ Política está CORRETA - apenas superadmins podem aprovar 3.4. APP SERVICE PROVIDER (app/Providers/AppServiceProvider.php) Gate::before configurado (linhas 26-31): ```php Gate::before(function ($user, $ability) { if ($user->is_superadmin) { return true; // SuperAdmin pode tudo } }); ``` ✅ Gate::before está CORRETO - superadmins têm bypass total 3.5. MIDDLEWARE CUSTOMIZADO Arquivo: app/Http/Middleware/SuperAdminOnly.php Status: Existe e funciona para rotas de empresas Arquivo: app/Http/Middleware/FranchiseOnly.php Status: Existe para rotas de clientes ================================================================================ 4. TENTATIVAS DE CORREÇÃO REALIZADAS ================================================================================ ✅ 1. Corrigido conexão com banco de dados correto (mysql-3306) ✅ 2. Verificado que todos os 5 usuários têm is_superadmin = 1 ✅ 3. Adicionado Gate::before em AppServiceProvider ✅ 4. Corrigido bug no PublicClienteRegisterController ✅ 5. Limpado todos os caches (config, route, cache, view, optimize) ✅ 6. Deletado sessões antigas do storage ✅ 7. Deletado views compiladas ✅ 8. Reconstruído containers Docker (docker-compose down/up) ❌ 9. ERRO 403 CONTINUA ================================================================================ 5. ANÁLISE DETALHADA DO PROBLEMA ================================================================================ 5.1. DISCREPÂNCIA NA URL - URL reportada com erro: http://172.233.21.57:8082/users/6/approve - Usuário ID 6 NÃO EXISTE no banco de dados - Apenas existem IDs: 1, 2, 3, 4, 5 POSSIBILIDADES: a) Usuário está tentando acessar registro inexistente b) Cache do navegador mostrando dados antigos c) Outro usuário foi deletado mas link ficou na interface 5.2. ROTA DE APROVAÇÃO - Rota registrada: PATCH /users/{user}/approve - Controller: UserController@approve - Middleware: auth, check.approval, check.empresa.aprovada - Policy: UserPolicy@approve (requer is_superadmin) 5.3. POSSÍVEIS CAUSAS DO 403 CAUSA 1: Middleware check.approval - Pode estar bloqueando requisição antes de chegar na policy - Precisa verificar: app/Http/Middleware/CheckApproval.php CAUSA 2: Middleware check.empresa.aprovada - Pode estar verificando aprovação da empresa do usuário - Precisa verificar: app/Http/Middleware/CheckEmpresaAprovada.php CAUSA 3: Resource Controller - Route::resource('users', UserController::class) gera rotas padrão - Método approve pode não estar sendo autorizado corretamente CAUSA 4: Policy não está sendo carregada - AuthServiceProvider pode não ter registrado UserPolicy - Precisa verificar: app/Providers/AuthServiceProvider.php CAUSA 5: Usuário ID 6 não existe - Laravel retorna 403 quando não encontra o modelo - Erro de Model Not Found sendo tratado como Unauthorized 5.4. GATE::BEFORE NÃO FUNCIONA? - Gate::before deveria dar bypass para is_superadmin - Mas erro 403 persiste - HIPÓTESE: Middleware bloqueia ANTES de chegar no Gate ================================================================================ 6. CONFIGURAÇÃO DO DOCKER ================================================================================ Container: freefi-8082 Networks: - root_mikrotik_net (external) - docker-php-profiles_lamp-network (external) Environment Variables (dentro do container): DB_CONNECTION=mysql DB_HOST=mysql-3306 DB_PORT=3306 DB_DATABASE=adm_freefi DB_USERNAME=cloud DB_PASSWORD=123 Volumes montados: - .env file montado no container - código Laravel montado em /var/www/html/ ================================================================================ 7. DADOS DOS USUÁRIOS NO BANCO ================================================================================ SELECT id, name, email, empresa_id, is_superadmin FROM users WHERE deleted_at IS NULL; | id | name | email | empresa_id | is_superadmin | |----|-------|--------------------------------------------|------------|---------------| | 1 | Cloud | linuxewireless@gmail.com | NULL | 1 | | 2 | Cloud | cloud@penseonline.com.br | NULL | 1 | | 3 | Joao | joao@gmail.com | NULL | 1 | | 4 | Cloud | teste@gmail.com | NULL | 1 | | 5 | Cloud | operacional@sistemasdistribuidos.com.br | NULL | 1 | ⚠️ NOTA: Todos os usuários têm empresa_id = NULL Isso pode ser problema com middleware check.empresa.aprovada! ================================================================================ 8. ARQUIVOS QUE PRECISAM SER VERIFICADOS ================================================================================ ALTA PRIORIDADE: [ ] app/Http/Middleware/CheckApproval.php [ ] app/Http/Middleware/CheckEmpresaAprovada.php [ ] app/Providers/AuthServiceProvider.php [ ] app/Http/Controllers/UserController.php (método approve) MÉDIA PRIORIDADE: [ ] app/Models/User.php (relações e scopes) [ ] config/auth.php [ ] bootstrap/cache/config.php (cache de configuração) BAIXA PRIORIDADE: [ ] app/Http/Kernel.php (middleware aliases) [ ] routes/auth.php ================================================================================ 9. ROTA DE DEBUG CRIADA ================================================================================ Arquivo: routes/web.php (linhas 213-223) ```php Route::middleware('auth')->get('/debug-user', function() { $user = Auth::user(); return response()->json([ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'is_superadmin' => $user->is_superadmin, 'is_superadmin_bool' => (bool)$user->is_superadmin, 'can_approve_self' => Gate::allows('approve', $user), ]); }); ``` URL: http://172.233.21.57:8082/debug-user Status: Registrada e funcionando (requer autenticação) OBJETIVO: - Verificar se is_superadmin está sendo lido corretamente - Verificar se Gate::allows retorna true para approve - Diagnosticar se o problema é na policy ou no middleware ================================================================================ 10. PRÓXIMOS PASSOS RECOMENDADOS ================================================================================ PASSO 1: Acessar rota de debug - URL: http://172.233.21.57:8082/debug-user - Verificar se is_superadmin = true - Verificar se can_approve_self = true PASSO 2: Verificar middleware CheckApproval - Ler arquivo app/Http/Middleware/CheckApproval.php - Verificar se bloqueia superadmins - Verificar lógica de aprovação PASSO 3: Verificar middleware CheckEmpresaAprovada - Ler arquivo app/Http/Middleware/CheckEmpresaAprovada.php - Verificar se bloqueia quando empresa_id = NULL - Verificar se exclui superadmins da verificação PASSO 4: Verificar AuthServiceProvider - Ler app/Providers/AuthServiceProvider.php - Confirmar que UserPolicy está registrada - Verificar se há outras configurações de Gate PASSO 5: Verificar UserController - Ler método approve em app/Http/Controllers/UserController.php - Verificar se chama $this->authorize('approve', $user) - Verificar lógica de aprovação PASSO 6: Resolver discrepância do ID 6 - Verificar se usuário ID 6 existiu e foi deletado - Verificar tabela users com deleted_at IS NOT NULL - Limpar cache do navegador do usuário PASSO 7: Verificar empresa_id = NULL - Todos os superadmins têm empresa_id NULL - Middleware check.empresa.aprovada pode estar bloqueando - Pode precisar criar empresa para superadmins OU - Modificar middleware para ignorar superadmins ================================================================================ 11. OBSERVAÇÕES IMPORTANTES ================================================================================ ⚠️ CUIDADO COM OS DADOS - Usuário solicitou: "cuidado com os dados ok? não quero perder dados dessa vez" - Fazer backup antes de qualquer alteração em produção - Testar mudanças em ambiente de desenvolvimento primeiro ⚠️ SISTEMA EM PRODUÇÃO - Ambiente: http://172.233.21.57:8082 - Usuários reais podem estar acessando - Evitar mudanças destrutivas - Documentar todas as alterações ⚠️ SEGURANÇA (OWASP) - Sistema implementa OWASP A01:2021 (Broken Access Control) - Não remover validações de segurança - Garantir que superadmin bypass não crie vulnerabilidades - Manter rate limiting e throttling ================================================================================ 12. HIPÓTESE PRINCIPAL ATUAL ================================================================================ HIPÓTESE MAIS PROVÁVEL: O middleware 'check.empresa.aprovada' está bloqueando a requisição porque: 1. Todos os superadmins têm empresa_id = NULL 2. O middleware provavelmente verifica se a empresa está aprovada 3. Como empresa_id = NULL, a verificação falha 4. Middleware retorna 403 ANTES de chegar na Policy 5. Gate::before nunca é executado porque middleware bloqueia antes SOLUÇÃO ESPERADA: Modificar o middleware CheckEmpresaAprovada para: - Ignorar verificação se user->is_superadmin === true - OU criar uma empresa "Sistema" para superadmins - OU remover middleware das rotas de usuários (apenas para superadmins) PRÓXIMA AÇÃO: Ler o conteúdo de app/Http/Middleware/CheckEmpresaAprovada.php para confirmar a hipótese e implementar a correção adequada. ================================================================================ FIM DO DOCUMENTO ================================================================================