MySQL jogosultság-szervezés
Weben elérhető szolgáltatás esetén sokszor előkerülhet a probléma, miként garantáljuk, hogy az Ügyfeleink ne keveredjenek mások adatai közé, illetve ugyanezt megfordítva, mivel biztosíthatjuk Őket, hogy más sem téved az Övékbe?
Az egyik megoldás bonyolult rekord-szintű ellenőrzéseket végrehajtani az adattáblákon, viszont ezeket felépíteni, fenntartani és módosítás esetén tesztelni szintén bonyolult.
Alternatív megoldásként saját adatbázist nyitunk minden Ügyfélnek, és olyan felhasználóval kapcsolódunk az adatbázishoz, amelyik csak azt az egyet képes olvasni/módosítani.
A felépítés lépései
Back-end oldalon
A tényleges megvalósítás lépéseiben fel kell vennünk egy adatbázist, ami az ügyféladatbázisok neveit és a hozzáféréseket tartalmazza.
CREATE DATABASE mester; CREATE TABLE hozzaferesek ( hf_adatbazis VARCHAR(30) NOT NULL PRIMARY KEY comment 'jsz_ elotag szukseges', hf_felhasznalo VARCHAR(15) NOT NULL, hf_jelszo VARCHAR(15) NOT NULL ); GRANT ALL ON mester.* TO 'hfmester' IDENTIFIED BY 'hfmester'; |
Egyúttal létrehoztunk egy felhasználót is, aki majd az adatokat fogja tudni karbantartani.
Egy új ügyfél felvétele esetén az alábbi lépéseket kell tehát végrehajtani:
- új alapadatbázis létrehozása
- mester-táblában bejegyzés létrehozása az adatbázis nevével és elérési jelszavával
- az új felhasználónak jogosultságot adni az új adatbázisra
Új alapadatbázis létrehozása
Az új adatbázis létrehozásánál figyelni kell az előtag használatára, erre később fogok még utalni.
CREATE DATABASE jsz_ujugyfel; |
Majd ezután kódból létrehozva, vagy mentésből betöltve létrehozzuk a táblákat is. (Ennek részletezése a téma szempontjából szükségtelen.)
Mester-táblában bejegyzés létrehozása
Egyelőre semmi mást nem csinálunk, mint feljegyezzük, hogy a jsz_ujugyfel
adatbázis is elérhető, a mellékelt névvel és jelszóval (ezek mysql
elérési adatok, nem a webfelületen használatosak!).
INSERT INTO mester.hozzaferesek (hf_adatbazis, hf_felhasznalo, hf_jelszo) VALUES ('jsz_ujugyfel', 'ujugyfelnev', 'ujugyfeljelszo'); |
Ahhoz, hogy el is tudjuk érni az új adatbázist, létre kell hoznunk a megfelelő felhasználót, aki az új adatbázisra van korlátozva.
Az új felhasználónak jogosultságot adni
Az újonnan létrejött adatbázishoz az alábbi módon tudunk jogot adni:
GRANT ALL ON jsz_ujugyfel.* TO 'ujugyfelnev' IDENTIFIED BY 'ujugyfeljelszo'; |
Ezzel azonban két probléma is van.
Az első, hogy ezt csak a root
– vagy vele egyenrangú – felhasználóval tudjuk kiadni.
Mivel én nem szeretek root
felhasználóval tevékenykedni, illetve más adatbázisok is helyet kaphatnak a szerveren, nem csak ehhez a rendszerhez tartozóak, ezért ki kell neveznünk egy felhasználót, akinek elég széles körű jogosultsága van, hogy az új adatbázisokhoz delegálni tudjon.
Itt lesz hasznos, hogy az ügyfelek adatbázisai előtagot kapnak.
A delegáló felhasználónk egyszerre kaphat az összes előtaggal rendelkező – és egyben a jövőben ilyen módon létrehozott – adatbázisunkhoz.
GRANT ALL ON `jsz\_%`.* TO 'hfdelegalo' IDENTIFIED BY 'hfdelegalo' WITH GRANT OPTION; |
Ilyen módon megadtunk minden jogosultságot a hfdelegalo
felhasználónknak a jsz_
előtaggal rendelkező adatbázisokhoz. A with grant option
rész pedig engedélyezi, hogy a meglévő jogait másra átruházza.
Az utasítás elején szereplő `jsz\_%`
pedig rögtön a – korábban említett – második hibát javítja. Ennek a lényege, hogy a '_'
karakter ujugyfelnev
nevű felhasználónk nem csak a jsz_ujugyfel
adatbázishoz kapott volna hozzáférést, hanem a jsz1ujugyfel
, jsz2ujugyfel
, jszAujugyfel
, … adatbázisokhoz is.
Ennek kivédésére körülírt formában kell megadnunk, hogy a '_'
esetében a tényleges karakterre szeretnénk szorítkozni, nem pedig a speciális értelmében használni azt.
Ezek után pedig az újonnan létrejött delegáló-felhasználónk már képes lesz a szándékaink szerinti korlátozott hozzáférést megadni az ügyfél-adatbázishoz.
GRANT ALL ON `jsz\_ujugyfel`.* TO 'ujugyfelnev' IDENTIFIED BY 'ujugyfeljelszo'; |
Ő már nem delegálhatja tovább a jogait, és jelen formában csak az egy megjelölt adatbázishoz fér hozzá.
Front oldalon
Értelemszerűen kell, hogy legyen egy adatbázis-felhasználónk a központi adatbázis olvasására is, aki azt sem írni, sem más adatbázishoz hozzáférni nem tud.
GRANT SELECT ON mester.hozzaferesek TO 'hfolvaso' IDENTIFIED BY 'hfolvaso'; |
Használat
A futtatás során az alábbi lépéseknek követik egymást:
- az alkalmazás belép a
hfolvaso
felhasználóval a mester adatbázisba, és lekérdezi az alkalmazást indító ügyfélhez tartozó adatokat (adatbázis, név, jelszó) - ezután átvált az újonnan megszerzett ismeretek által meghatározott adatbázisra
- az alkalmazás teljes mellszélességgel garázdálkodik a megjelölt adatok között, a legkisebb esélye nélkül, hogy más ügyfél adataiban kárt lenne képes tenni
Összefoglalás
A kicsit kusza ismertető után röviden és tömören az elkészítés lépései, az utasításblokkok elején megjelölve, hogy melyik felhasználóval és mikor kell végrehajtani.
mysql-root
– egyszer az alkalmazás telepítésénél
CREATE DATABASE mester; CREATE TABLE hozzaferesek ( hf_adatbazis VARCHAR(30) NOT NULL PRIMARY KEY comment 'jsz_ elotag szukseges', hf_felhasznalo VARCHAR(15) NOT NULL, hf_jelszo VARCHAR(15) NOT NULL ); GRANT ALL ON mester.* TO 'hfmester' IDENTIFIED BY 'hfmester'; GRANT SELECT ON mester.hozzaferesek TO 'hfolvaso' IDENTIFIED BY 'hfolvaso'; GRANT ALL ON `jsz\_%`.* TO 'hfdelegalo' IDENTIFIED BY 'hfdelegalo' WITH GRANT OPTION; |
hfmester
– minden új ügyfél felvételekor
INSERT INTO mester.hozzaferesek (hf_adatbazis, hf_felhasznalo, hf_jelszo) VALUES ('jsz_ujugyfel', 'ujugyfelnev', 'ujugyfeljelszo'); |
hfdelegalo
– minden új ügyfél felvételekor
CREATE DATABASE `jsz\_ujugyfel`; GRANT ALL ON `jsz\_ujugyfel`.* TO 'ujugyfelnev' IDENTIFIED BY 'ujugyfeljelszo'; |
Itt értelemszerűen az aktuálisan létrehozott ügyfélhez tartozó adatokat adjuk meg, ahogy az előbbi insert
esetében is.
Ügyfél végleges törlése esetén – a megfelelő mentések elkészítése után – az utolsó három utasítást kell érvényteleníteni.
hfdelegalo
– ügyfél törlése esetén
REVOKE ALL ON `jsz\_ujugyfel`.* FROM 'ujugyfelnev'; DROP DATABASE `jsz\_ujugyfel`; |
hfmester
– ügyfél törlése esetén
DELETE FROM mester.hozzaferesek WHERE hf_adatbazis = 'jsz_ujugyfel'; |
De ez igazából már csak kiegészítés.
Webfejlesztő tudásbázis, második rész: Kliens-szerver kommunikáció Kód-optimalizálás php-ban
Comments are currently closed.