Skip to content

Autorização Admin

O acesso ao painel administrativo requer role ADMIN ou SUPER_ADMIN. Esta página documenta o sistema de autorização para administradores.

Roles do Sistema

RoleDescriçãoPermissões
USERUsuário comumJogar, depositar, sacar
ADMINAdministradorGerenciar usuários, caixas, itens, pagamentos
SUPER_ADMINSuper adminTudo + gerenciar outros admins

Fluxo de Autorização Admin

Implementação

AdminGuard

typescript
// src/presentation/guards/admin.guard.ts

@Injectable()
export class AdminGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const user = request.user;

    if (!user) {
      throw new UnauthorizedException('Authentication required');
    }

    const allowedRoles = ['ADMIN', 'SUPER_ADMIN'];
    
    if (!allowedRoles.includes(user.role)) {
      throw new ForbiddenException('Admin access required');
    }

    return true;
  }
}

Uso nos Controllers

typescript
// src/presentation/controllers/admin.controller.ts

@Controller('admin')
@UseGuards(AuthGuard, AdminGuard) // Ambos os guards
@ApiTags('Admin')
export class AdminController {
  
  @Get('dashboard/stats')
  @ApiOperation({ summary: 'Get dashboard statistics' })
  async getDashboardStats() {
    return this.getDashboardStatsUseCase.execute();
  }

  @Post('users/:id/ban')
  @ApiOperation({ summary: 'Ban a user' })
  async banUser(
    @Param('id') userId: string,
    @Body() dto: BanUserDto,
    @CurrentUser() admin: User,
  ) {
    return this.banUserUseCase.execute(
      BigInt(userId),
      dto.reason,
      admin.id,
    );
  }
}

Decorador Combinado

typescript
// src/presentation/decorators/admin.decorator.ts

export function Admin() {
  return applyDecorators(
    UseGuards(AuthGuard, AdminGuard),
    ApiBearerAuth(),
    ApiResponse({ status: 401, description: 'Unauthorized' }),
    ApiResponse({ status: 403, description: 'Forbidden - Admin only' }),
  );
}

// Uso simplificado
@Controller('admin')
@Admin()
export class AdminController {
  // ...
}

Verificação no Frontend (Dashboard)

typescript
// next-shadcn-admin-dashboard/src/contexts/auth-context.tsx

export function AuthProvider({ children }: { children: React.ReactNode }) {
  const [user, setUser] = useState<User | null>(null);
  const [isLoading, setIsLoading] = useState(true);
  const router = useRouter();
  const pathname = usePathname();

  useEffect(() => {
    checkAuth();
  }, []);

  const checkAuth = async () => {
    try {
      const userData = await api.auth.getMe();
      
      // Verifica se é admin
      if (!['ADMIN', 'SUPER_ADMIN'].includes(userData.role)) {
        router.push('/unauthorized');
        return;
      }
      
      setUser(userData);
    } catch (error) {
      // Não autenticado - redirect para login
      if (!isPublicPath(pathname)) {
        router.push('/login');
      }
    } finally {
      setIsLoading(false);
    }
  };

  const isAdmin = user?.role === 'ADMIN' || user?.role === 'SUPER_ADMIN';
  const isSuperAdmin = user?.role === 'SUPER_ADMIN';

  return (
    <AuthContext.Provider value={{ user, isLoading, isAdmin, isSuperAdmin }}>
      {children}
    </AuthContext.Provider>
  );
}

Permissões Granulares (SUPER_ADMIN)

Algumas ações são exclusivas do SUPER_ADMIN:

typescript
// Apenas SUPER_ADMIN pode:
// - Promover usuários para ADMIN
// - Remover outros admins
// - Acessar logs de auditoria de admins
// - Ajustar configurações do sistema

@Post('users/:id/promote')
@ApiOperation({ summary: 'Promote user to admin (SUPER_ADMIN only)' })
async promoteToAdmin(
  @Param('id') userId: string,
  @CurrentUser() admin: User,
) {
  if (admin.role !== 'SUPER_ADMIN') {
    throw new ForbiddenException('Only SUPER_ADMIN can promote users');
  }

  return this.promoteUserUseCase.execute(BigInt(userId));
}

Auditoria de Ações Admin

Todas as ações de admin são logadas:

typescript
// Após cada ação admin
await this.auditService.log({
  action: 'ADMIN_BAN_USER',
  userId: admin.id,
  entityType: 'User',
  entityId: targetUserId,
  metadata: {
    reason: dto.reason,
    adminRole: admin.role,
  },
});

Logs de Auditoria Admin

sql
-- Buscar ações de um admin específico
SELECT * FROM audit_logs
WHERE user_id = :adminId
  AND action LIKE 'ADMIN_%'
ORDER BY created_at DESC;

-- Ações sensíveis (últimas 24h)
SELECT * FROM audit_logs
WHERE action IN ('ADMIN_BAN_USER', 'ADMIN_ADJUST_BALANCE', 'ADMIN_APPROVE_WITHDRAWAL')
  AND created_at > NOW() - INTERVAL '24 hours'
ORDER BY created_at DESC;

Página de Acesso Negado

typescript
// next-shadcn-admin-dashboard/src/app/(main)/unauthorized/page.tsx

export default function UnauthorizedPage() {
  return (
    <div className="flex flex-col items-center justify-center h-screen">
      <h1 className="text-4xl font-bold text-red-500">403</h1>
      <h2 className="text-2xl mt-4">Acesso Negado</h2>
      <p className="text-gray-500 mt-2">
        Você não tem permissão para acessar esta área.
      </p>
      <p className="text-gray-500">
        Esta área é restrita a administradores.
      </p>
      <a href="/" className="mt-6 text-blue-500 hover:underline">
        Voltar para o site
      </a>
    </div>
  );
}

Segurança Adicional

IP Whitelist para Admin (Opcional)

typescript
// Para ambientes de alta segurança
@Injectable()
export class AdminIpGuard implements CanActivate {
  private readonly allowedIps = [
    '10.0.0.0/8',     // Rede interna
    '192.168.1.100',  // IP específico
  ];

  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const clientIp = request.ip;

    if (!this.isIpAllowed(clientIp)) {
      throw new ForbiddenException('IP not allowed for admin access');
    }

    return true;
  }
}

Notificações de Login Admin

typescript
// Notifica quando admin faz login
async onAdminLogin(admin: User, ip: string) {
  await this.notificationService.sendToSuperAdmins({
    type: 'ADMIN_LOGIN',
    title: 'Login de Administrador',
    message: `${admin.username} (${admin.role}) fez login de ${ip}`,
  });
}

Arquivos Fonte

Principais Arquivos

  • src/presentation/guards/admin.guard.ts - Guard de admin
  • src/presentation/controllers/admin.controller.ts - Controller admin
  • next-shadcn-admin-dashboard/src/contexts/auth-context.tsx - Auth do dashboard
  • prisma/schema.prisma - Enum UserRole

Documentação Técnica CSGOFlip