Используя Postgresql в качестве среднего слоя. Нужно мнение
Мне нужно несколько мнений.
Я собираюсь разработать программное обеспечение для POS и инвентаря для друга. Это небольшой проект для одного человека, поэтому я хочу максимально упростить архитектуру.
Я использую Winform для разработки GUI (веб-интерфейс не имеет смысла для программного обеспечения POS). Для базы данных я использую Postgresql.
Программа будет контролировать доступ на основе пользовательских ролей, поэтому либо мне придется разработать средний уровень с использованием веб-сервера для управления пользовательским доступом, либо я могу просто установить привилегии пользователей непосредственно в Postgresql.
Разработка среднего уровня потребует много времени, а обслуживание будет более сложным. Поэтому я предпочитаю устанавливать контроль доступа непосредственно в базе данных.
Теперь кажется, что использование базы данных для контроля доступа пользователей проблематично. Я должен установить привилегии для каждой роли. Не говоря уже о том, что для некоторых таблиц привилегии находятся на уровне столбцов. Это делает рассуждения о безопасности очень трудными.
Так что я сейчас делаю так, чтобы все таблицы были недоступны, кроме суперпользователей. Программа будет подключаться к базе данных, используя публичную роль. Поскольку таблицы недоступны для общего доступа, я собираюсь сделать общедоступными хранимые функции с помощью SECURITY DEFINER (с ролью суперпользователя). Единственный способ получить доступ к таблицам - использовать эти функции.
Я положу пользовательские роли и пароли в таблицу. Поскольку сама таблица пользователя недоступна не суперпользователю, я сделаю функцию входа в систему, давайте назовем ее fn_login(username, password)
, fn_login вернет ключ сеанса, если вход в систему успешен.
Для вызова других функций нам нужно предоставить сеансовый ключ для пользователя, например: fn_purchase_list(session_key)
, fn_purchase_new(session_key, purchase_id, ...)
,
Таким образом, я рассматриваю хранимые функции как API. Добавление нового пользователя будет проще, поскольку мне нужно только добавить новые строки в пользовательскую таблицу, а не добавлять новые роли Postgresql. Мне не нужно устанавливать привилегии на уровне столбцов. Все элементы управления будут выполнены программно.
Так что ты думаешь? Является ли этот подход осуществимым и масштабируемым? Есть ли лучший способ сделать это?
Спасибо!
4 ответа
Я считаю, что есть лучший способ сделать это. Но так как вы еще не обсудили, какой тип безопасности вам нужен, я не могу уточнить детали.
Поскольку вы разрабатываете код приложения в.NET, этому коду нужно доверять (в отличие от веб-приложения). Поэтому, почему бы вам просто не реализовать свои роли и разрешения в коде приложения, а не в базе данных?
Меня беспокоит ваш заявленный подход - это накладные расходы на хранимые процедуры. Хотелось бы, чтобы вы написали указанные функции в C#, а не в PostgreSQL. Затем могут применяться стандартные методы контроля версий и разработки программного обеспечения.
Если вы подождете, пока кто-то не найдет в вашей базе данных проверку безопасности, я думаю, вы опоздаете. Это менталитет клиент / сервер, который вышел в конце 90-х годов. Это одна из причин, почему n-уровневые архитектуры вошли в моду. Клиент / сервер не может масштабироваться по горизонтали, а также является многоуровневым решением.
Я бы посоветовал вам лучше использовать средний уровень. Безопасность должна быть междисциплинарной задачей, которая находится на более высоком уровне, чем уровень персистентности.
Мой честный совет: не изобретайте ПОС и инвентарь. Возьмите один из существующих проектов и сделайте его лучше.
Если проблема заключается в УПРАВЛЕНИИ безопасностью базы данных, вам следует добавить задачу автоматизации этого управления. Это означает, что вы можете хранить данные более высокого уровня в таблицах базы данных, а затем ваше приложение может преобразовать эти данные в соответствующие данные и артефакты, необходимые для базы данных.
Похоже, что в базе данных есть детали, которые вам нужны, вам просто нужно упростить управление этими деталями и добавить их в ваше приложение.