PHP / Nette Multitenant systém na Wedos rubrika: Programování: PHP
Ahoj,
chtěl bych vytvořit automatický multitenantní systém, kde by si zákaznící zakládali vlastní subdomény,...
prostředí:
Wedos hosting (PHP, jedna MySQL databáze/MariaDB, apache)
Chtěl bych se nejdříve zeptat jestli je možné vytvořit databázovou strukturu podobně jak to řeší knihovna pro Django, že vytváží schéma v databázi (PostgreSQL), jestli je toto možné i na MySQL.
Nechci mít u každého záznamu tenant_id a vytvářet separátní databáze na wedosu automaticky nejde.
Doctrine?
Bylo by možné naimplementovat toto v Doctrině a Nette?
Ptám se čistě z hlediska PHP a Wedosu, jeslti je na této levné infrastruktuře toto vůbec nějak realizovatelné.
Nebráním se jiným PHP frameworkům.
Díky za váš čas a jakékoli rady,
Luboš
Tady, musel jsem si zjistit co to vlastně "multitenantní" znamená. A s překvapením jsme zjistil, že jednu takovou aplikaci zrovna píšu (nějaký rezervační systém).
Zvolil jsem řešení s jednou db, s jednou definovanými tabulkami a skoro v každé tabulce mám "tenant_id" (u mě akce_id). Samozřejmě třeba v faktury_rozpis už akce_id není protože je tam faktura_id ukazující na faktury z které si to načtu.
Z hlediska kódu počítám s tím, že každá akce bude mít vlastní doménu, všechny jsou směrované na jeden adresář s kódem a podle $_SERVER['HTTP_HOST'] poznám o koho jde. Pak je tam adresář skins s podadresáři dle domén, v nichž jsou nějaké CSS a IMG (každý zákazník bude mít vlastní vzhled).
Na žádné zásadní problémy jsem zatím nenarazil.
Komentáře
- ivoszz : Napadá mne klasická hláška: Je to bezpečné? — 16.5.2018
- rmaslo : Tak když se to správně naprogramuje tak to určitě bezpečné je :-). Otázka by spíše mohla znít: "Co se musí udělat navíc oproti běžné apliakci, aby se nezobrazila cizí data?" Třeba z úrovně SQL je odpověď je vlastně jednoduchá, v každém dotazu na základní tabulku (tj. s akce_id) musí být navíc podmínka ' ... WHERE akce_id = '.GetAkceId(). Z úrovně třeba ORM by byla odpověď stejná - nesmí se zapomenout na toto omezení. A pak by mohla přijít otázka "dá se udělat nějaká pojistka, kdyby na to programátor zapomněl"? Určitě ano, já třeba všechna data vykresluji v nějakých gridech, grid ví na jaké je doméně z toho může zjistit akce_id a pokud by zjistil, že v (nevykreslovaném sloupci) akce_id je jiný údaj než akce_id z domény kde běží tak by výstup mohl zastavit. Dělal jsem takovouto pojistku? Ne, dotazy na data musí být napsány správně (správně nadefinovány v ORM, či nějakém vyšším nástroji) a musí vracet správná data ze všech hledisek - dělat speciální kontrolu na jeden druh chyb mi přijde zbytečné. — 22.5.2018
Pro zobrazení všech 4 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře