Как включить контроль доступа в SQLite? - PullRequest
2 голосов
/ 14 ноября 2011

У нас есть приложение, которое использует SQLite в качестве встроенной СУБД. Изначально приложение предназначалось для одного компьютера и одного пользователя. Но со временем масштабы проекта расширились. Теперь одна из функций, которая нам нужна, это Fine grained access control.

Теперь, как уже упоминалось в Соответствующее использование для SQLite

... SQLite пришлось пожертвовать другим характеристики, которые некоторые люди находят полезными, такие как высокие параллелизм, детальный контроль доступа , богатый набор встроенных функции ...

А в этом сообщении на форуме

sqlite не имеет имен пользователей и паролей. Вы не можете защитить данные файлы таким образом.

Итак, из вышесказанного очень ясно, что контроль доступа недоступен. И в некотором смысле это имеет смысл, поскольку он в основном используется в мобильных приложениях, браузерах или там, где требуется встроенная БД.

Согласно этому SO post возможно зашифровать базу данных. Но, насколько мне известно, я не могу описать его как fine grained access control, поскольку база данных SQLite привязана к одному ключу шифрования. Кроме того, у меня не может быть нескольких пользователей с разными уровнями доступа.

Now my question are:

  1. Можно ли в любом случае включить управление доступом в SQLite? (Возможно, я ответил на мой вопрос, но все же, для внутреннего удовлетворения, я задаю этот вопрос :))
  2. Правильно ли мое понимание fine grained access control, связанное с шифрованием?
  3. Допустим, если я использую шифрование для одного компьютера и одного пользователя, то в чем его недостатки по сравнению с настоящим fine grained access control? (производительность может быть одной из них, поскольку мы должны расшифровывать ее для каждого соединения ... не уверен)

Some Useful Information

  1. Мы используем последнюю версию SQLite.
  2. SQLite встроен как часть исходного кода.
  3. В полном объеме мы можем рассчитывать на базу данных размером 1 ГБ или около.

Примечание: Я знаю, что хорошо использовать любую другую СУБД, где доступно управление доступом, но вопрос очень специфичен для SQLite . Пожалуйста, ответьте на них в этом свете. Спасибо.

Ответы [ 4 ]

6 голосов
/ 14 ноября 2011

В SQLite отсутствует контроль доступа (имеется в виду контроль доступа на уровне таблицы GRANT / REVOKE).Вы должны обеспечить любой контроль доступа, который вам требуется, через код приложения.Шифрование обеспечивает контроль доступа только на самом грубом уровне - вы можете получить доступ к базе данных или нет.

2 голосов
/ 14 ноября 2011

Во-первых, как вы собираетесь делиться базой данных SQLite?SQLite не имеет сервер-клиентской архитектуры, такой как mysql / postgresql.

Возможно, вы захотите перейти на MySQL или PostgreSQL, если вы хотите, чтобы несколько компьютеров использовали одну и ту же базу данных одновременно, иначе она будет такой жесовместное использование базы данных Microsoft Access.

SQLite имеет тенденцию очень сильно расти со временем, если вы выполняете много операций вставки / обновления / удаления.Файл всегда будет расти, но никогда не будет уменьшаться.

0 голосов
/ 12 марта 2016

При поиске именно этой темы я подумал об этой идее (я использую python для взаимодействия с базой данных):

  1. Создать таблицу 'admin'
  2. Сохранение списка имен пользователей и паролей (конечно, хэшируется)
  3. Создайте запрос имени пользователя / пароля в python, выйдите, если хеш и пароль не совпадают
  4. Создать столбец с уровнями привилегий
  5. Создать таблицу с этими уровнями привилегий (для нормализации) и связанными типами запросов, которые этот уровень может выполнять. Необязательно - создайте в этой таблице еще один столбец для именования уровней доступа
  6. Пропускать каждый запрос через функцию, которая соответствует этой проверке уровня полномочий этого пользователя и проверяет, содержит ли запрос какую-либо из утвержденных команд. Если нет, то предоставляется доступ с ограниченным доступом.

Очевидно, что не в камне, и я думаю, что есть способы обойти «сдерживание», так что я тоже буду мозговым штурмом. О чем подумать.

0 голосов
/ 03 мая 2012

Я не знаю, насколько хорошо эта идея сработает, если вообще будет, поэтому другие комментарии очень приветствуются.

Не могли бы вы сделать что-то вроде следующего ...

На каждомТерминал имеет локальную встроенную базу данных SQLite.

Когда приложение закрывается или при каждом обновлении внутренних данных (я полагаю, выбор за вами), создайте триггер для «главной БД», которая находится «в сети».' где-то.Здесь вы вставляете значение, которое имеет обновление, и у вас есть второй столбец для каждого поля для хранения имени пользователя (например, взятого из имени для входа в локальный терминал).

Я не уверен, еслиэто будет работать или нет?Затем вы могли бы реализовать таблицу в каждом «локальном» файле sqlite, который представлял собой список имен пользователей и паролей, для управления доступом к внутреннему главному файлу (и, возможно, к самому файлу sqlite, используя ваше приложение для запроса имени пользователя).и их конкретный пароль).После этого вы могли бы даже включить гостевого пользователя «только для просмотра», который (через ваше приложение) может выполнять только поиск данных.Эта таблица, очевидно, должна быть записана только из соединения с главной БД.

Тогда вам, конечно, потребуется встроить метод для обновления каждой локальной копии копией на сервере и контролировать любое повреждениепроблемы / целостности ... которые могут начать создавать другие проблемы и привести к тому, что внешний интерфейс вашего приложения станет значительно более сложным (насколько я понимаю, SQLite не может проводить такого рода внутреннее тестирование, поскольку sqlite не является клиентом/ server type RDBMS).

Конечно, после того, как вы проделали всю эту тяжелую работу, вы могли бы поделиться ею с командой SQLite, и тогда sqlite станет еще более практичным для многих случаев.

Дэвид

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...