Как правильно реализовать безопасность доступа к данным на MySQL?

Привет!


Есть несколько табличек с важными записями. Есть пользователи, группы и подразделения. Нужно организовать механизм безопасности доступа к данным. Чтобы пользователи могли читать и редактировать только свои записи, своей группы или своего подразделения. Что-то наподобие безопасности на файловой системе. Сложность в том, что один объект — запись в табличке может быть назначена для нескольких пользователей, групп или подразделений.


Например делать ли отдельную таблицу с правами, или добавить колонку. Вот только не понятно что туда писать, как правильно закодировать значение прав, чтобы потом можно было быстро делать выборки. Какие бывают подходы, как правильно реализовывать, что почитать?


Язык Java, база MySQL.
  • Вопрос задан
  • 3008 просмотров
Пригласить эксперта
Ответы на вопрос 3
@pwlnw
Если групп немного без тенденций к росту, можете изобразить ограничивающие VIEW и раздать доступ пользователям туда.

Другой способ — хранимые процедуры старательно проверяющие все параметры. Пользователями дают доступ к этим процедурам, а доступа к таблицам напрямую не дают.
Проблема в том, что в mysql эти вещи недостаточно полно и удобно реализованы.

Третий способ -«трехзвенка». дополнительная серверная программа, с которой общаются клиентские приложения. Она делает все проверки на удобном вам языке.
Ответ написан
@pwlnw
Если групп немного без тенденций к росту, можете изобразить ограничивающие VIEW и раздать доступ пользователям туда.

Другой способ — хранимые процедуры старательно проверяющие все параметры. Пользователями дают доступ к этим процедурам, а доступа к таблицам напрямую не дают.
Проблема в том, что в mysql эти вещи недостаточно полно и удобно реализованы.

Третий способ -«трехзвенка». дополнительная серверная программа, с которой общаются клиентские приложения. Она делает все проверки на удобном вам языке.
Ответ написан
Комментировать
pentarh
@pentarh
В MySQL вам это сделать не удастся. Без гранта на SELECT, CALL не выполняется. Вообще там привилегии через жопу сделаны. Пример. Делаем 1 таблицу и одну процедуру с селектом из этой таблицы. Юзеру даем грант ТОЛЬКО на выполнение процедуры. Результат: процедура не выполняется, т.к. нет гранта на SELECT внутри процедуры. Полный бред…

mysql> create database t;
Query OK, 1 row affected (0.00 sec)

mysql> use t
Database changed
mysql> CREATE TABLE `testtable` (
-> `id` int(11) NOT NULL,
-> `name` varchar(255) NOT NULL
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.06 sec)

mysql> DELIMITER $$
mysql> CREATE
-> PROCEDURE testproc ()
-> SQL SECURITY INVOKER
-> BEGIN
-> SELECT * FROM testtable;
-> END$$
Query OK, 0 rows affected (0.00 sec)

mysql> grant usage on t.* to testuser@localhost identified by 'qwe';
Query OK, 0 rows affected (0.01 sec)
mysql> grant execute on procedure t.testproc to testuser@localhost;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye

# mysql -u testuser -p
mysql> use t
Database changed
mysql> select * from testtable;
ERROR 1142 (42000): SELECT command denied to user 'testuser'@'localhost' for table 'testtable'
mysql> call testproc();
ERROR 1142 (42000): SELECT command denied to user 'testuser'@'localhost' for table 'testtable'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы