msa6886
@msa6886

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

Имеется таблица permissions,
5d36c5a10af52882377632.png

После входа пользователя на сайт, из данной таблицы в соответствии с id_person считываются строки, т.е. эти 3 строки.
В них записано название таблицы и номер строки в таблице, эта инфа доступна пользователю. Можно ли делать таким образом? Правильно ли хранить название таблицы в varchar? Какой есть более правильный способ, предоставлять пользователю необходимую ему информацию?
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ответы на вопрос 1
Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!
Мне кажется Вы либо как-то слишком перемудрили с логикой, либо подошли к вопросу не с той стороны. К тому же, Вы не указали, касательно какой конкретной БД этот вопрос.

Например, в MySQL'е (в данный момент проверят на MariaDB, но думаю оригинальный MySQL работает так же), если нужно ограничить доступы - это можно сделать на уровне пользователей самой БД, причём выставить отдельные ограничения на каждые: Базу -> таблицу -> отдельную колонку.

Если же Вам нужно ещё жестче ограничить данные - я бы рекомендовал добавлять данные о доступах к самим данным непосредственно.

Например, если бы мы использовали PostgreSQL: в таблицу "news", к каждой новости я бы добавлял список пользователей, которые могут читать конкретно эту новость, в отдельную колонку типа "массив" со списком ID пользователей, что бы иметь возможность делать такую выборку на уровне "чистых запросов" или просто воспользовался бы механизмом row level security (пока не приходилось пользоваться таким, но думаю это как раз то, о чём Вы говорите).

А если MySQL: создал бы для каждой такой таблицы создал бы таблицу-спутник в которой были бы прописаны права на каждую отдельную запись, по такому же принципу, как описано выше. Или попробовал бы реализовать аналогичную схему (как описал в варианте для PosgtreSQL), только роль поля-массива выполняло бы JSON-поле (насколько это сработало бы и насколько бы оно работало быстро, если заработало бы - точно сказать не могу, в MySQL я так делать ещё не пробовал, но в теории так сделать можно).

В Вашем варианте мне решительно не нравится то, что Вы храните имена таблиц в другой таблице. Таким образом, эти имена с большей вероятностью невозможно будет использовать внутри SQL-запроса, что в свою очередь создаёт серьёзную специфику при работе с такой БД, которую я бы настоятельно рекомендовал избегать, в частности что бы гарантировать корректность прав между запросами - нужно будет каждый запрос на SELECT оборачивать в транзакцию, как минимум...

P.S. Ещё вот тут описывают некоторую реализацию row level security для MySQL'а.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы