Krátká odpověď:neposkytujte svým uživatelům přímý přístup k databázi. Nikdy by se neměli mít možnost připojit. Do produkční databáze by měli mít přístup pouze osoby odpovědné za údržbu a provoz. Je to z bezpečnostních důvodů. Téměř v každém případě, kdy jsou informace uloženy v databázi, existuje aplikace, která řídí veškerý přístup, zajišťuje provádění skutečných aktualizací a prosazuje obchodní logiku, kterou si zvolíte.
Nesměšujte data s obchodní logikou.
Existují některé databázové systémy, jako je Oracle, které vynikají tím, že umožňují uložit a aplikovat velkou část vaší obchodní logiky uvnitř databáze samotné. To je však pro jiný typ aplikace a jiný přístup ke stavebním systémům.
MySQL nemá všechny tyto nástroje, aby to bylo tak snadné. Věřte mi, když vám řeknu, že se chystáte na noční můru údržby, pokud se pokusíte zapsat logiku své aplikace do spouštěčů a uložených procedur a pohledů, a pak dát svým uživatelům přímý přístup k databázi.
Kdy jste naposledy dostali přímý přístup k databázi, když jste se k něčemu přihlásili? Twitter, Netflix, Groupon, Facebook – komunikujete s webovou aplikací, která uplatňuje obchodní pravidla a čte a zapisuje data do databáze vaším jménem.
Existuje spousta nástrojů, které usnadňují psaní vašeho aplikačního softwaru:ladění, profilování, kontrola zdroje pro vývoj kódu a spolupráci, testování jednotek, kontinuální integrace a nástroje pro nasazení. Pokud se pokusíte zapsat vše do databáze, o všechno přijdete.
Zde je rychlý příklad, jak by to fungovalo:
Strukturujte svůj systém oprávnění jako tři tabulky:uživatel, skupina, skupina_uživatelů. Uživatel drží uživatelské účty ve vašem systému, skupina má různé úrovně přístupu, jako je „admin“, „klient“, „anonymní“ atd. Skupiny jsou způsob, jakým uživatelům přidělujete úrovně přístupu.
`CREATE TABLE `user` (
`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(64) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `group` (
`group_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
PRIMARY KEY (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_group` (
`user_id` int(10) unsigned NOT NULL,
`group_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`user_id`,`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;`
Nyní definovat některé skupiny
`insert into `group` (name) values ('admin'), ('user'), ('anonymous');`
A uživatele, pak je přidejte do skupiny administrátorů:
`insert into user (email) values ('[email protected]');`
`insert into user_group (user_id,group_id) values (1,1);`
Nyní tento model oprávnění říká, že uživatel může patřit do jedné nebo více skupin zabezpečení. Vaše aplikace by tyto skupiny zkontrolovala a na základě výsledků provedla různé akce. Podívejme se na nějaký pseudokód:
Načíst skupiny uživatele:
class User {
private $user_id;
private $groups;
private $db;
function load_groups() {
// query the database
$result = $db->query("SELECT name FROM `group` g JOIN user_group ug USING (group_id) WHERE user_id={$this->user_id}");
// save an array of group names
while ($row = $result->fetchrow()) {
$this->groups[] = $row['name'];
}
}
function is_member($group) {
if (in_array($group, $this->groups) {
return true; // user group includes this value
}
return false; // user is not in the group
}
Nyní ve své aplikaci můžete mít funkci pro zobrazení dat, ale výsledkem by byly různé výsledky v závislosti na skupinách uživatelů:
function display_data($user_object) {
display_basic_data(); // everyone sees the basic data
if ($user_object->is_member('admin')) {
// if the user is an admin, then display bank data too
display_bank_data();
}
}
Podobně by vaše funkce pro úpravu dat měly ověřit, že uživatelé mají oprávnění věci měnit.