Mysql
 sql >> база данни >  >> RDS >> Mysql

Прилагане на разрешения за колона за таблица върху задействане

Краткият отговор:не давайте на потребителите си директен достъп до базата данни. Те никога не трябва да могат да се свързват. Само хората, отговорни за поддръжката и операциите, трябва да имат достъп до производствената база данни. Това е от съображения за сигурност. В почти всеки случай, когато информацията се съхранява в база данни, има приложение, което контролира целия достъп, обработва действителните актуализации и налага бизнес логиката, която изберете.

Не смесвайте данни с бизнес логика.

Има някои системи за бази данни, като Oracle, които се отличават с възможността да съхранявате и прилагат голяма част от вашата бизнес логика в самата база данни. Това обаче е за различен тип приложение и различен подход към изграждането на системи.

MySQL няма всички тези инструменти, за да направи това толкова лесно. Повярвайте ми, когато ви кажа, че се настройвате за кошмар за поддръжка, ако се опитате да напишете логиката на приложението си в тригери и съхранени процедури и изгледи, след което дадете на потребителите си директен достъп до базата данни.

Кога за последен път ви беше даден директен достъп до базата данни, когато сте се регистрирали за нещо? Twitter, Netflix, Groupon, Facebook – вие взаимодействате с уеб-базирано приложение, което прилага бизнес правилата и чете и записва данни в базата данни от ваше име.

Има много инструменти, които улесняват писането на вашия приложен софтуер:отстраняване на грешки, профилиране, контрол на кода за код и съвместна разработка, тестване на модули, инструменти за непрекъсната интеграция и внедряване. Ако се опитате да запишете всичко в базата данни, ще загубите всичко това.

Ето един бърз пример за това как ще работи това:

Структурирайте вашата система за разрешения като три таблици:потребител, група, потребителска_група. Потребителят държи потребителските акаунти във вашата система, групата притежава различните нива на достъп като „администратор“, „клиент“, „анонимен“ и т.н. Групите са начинът, по който задавате нива на достъп на потребителите.

`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;`

Сега да дефинираме някои групи

`insert into `group` (name) values ('admin'), ('user'), ('anonymous');`

И потребител, след което ги добавете към групата на администраторите:

`insert into user (email) values ('[email protected]');`
`insert into user_group (user_id,group_id) values (1,1);`

Сега този модел на разрешения казва, че потребителят може да принадлежи към една или повече групи за сигурност. Вашето приложение ще провери за тези групи и ще извърши различни действия въз основа на резултатите. Нека видим някакъв псевдокод:

Заредете потребителски групи:

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
 }

Сега във вашето приложение може да имате функция за преглед на данните, но тя ще даде различни резултати в зависимост от групите на потребителя:

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();
   }
}

По същия начин вашите функции за промяна на данни трябва да проверяват дали потребителите имат разрешения да променят нещата.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP и mySQL:Бъг от 2038 г.:Какво е това? Как да го реша?

  2. mysql команден ред връща време за изпълнение?

  3. Какво се случва с низа за съвпадение на цяло число в MySQL?

  4. Auto_increment стойности в InnoDB?

  5. MySQL заявка - използвайки SUM от COUNT