Около 10 лет я работал над различными внутренними клиентскими приложениями для настольных компьютеров с хранилищами данных SQL Server. Редко я начинал эти проекты - большинство из них занимаются поглощением.
Одна вещь, которая везде казалась постоянной, заключалась в том, что существовала единственная глобальная учетная запись пользователя SQL Server, которая использовалась этим приложением, которая предоставляла ему разрешение для общей базы данных, и да, в некоторых наивных ситуациях она использовала sa
учетную запись пользователя, которую я обычно пытался исправить, когда это было возможно ,
Вы не можете эффективно скрыть это имя пользователя и пароль, которые приложение использует для доступа к базе данных. Они , как правило , хранятся в одном ini
или config
файл, или , возможно , запеченные в сам исполняемый файл. Во всех случаях они видны пользователю, если они немного копают. В одном случае мы фактически использовали config
файл, но зашифровали его, но, конечно, ключ шифрования должен был быть сохранен в исполняемом файле (мы не были наивны в отношении ограничений этого, но он действительно не позволял людям ковыряться, которые были достаточно опытны смотреть в config
файлах).
Все эти системы имели встроенную в приложение систему аутентификации пользователей, но, конечно, все они управлялись через само приложение, то есть информация о пользователях сохранялась в базе данных. Приложение ограничивало то, что вы можете делать, в зависимости от уровня доступа, но это все равно, что просто подключиться к базе данных и выполнить специальные запросы.
Мне интересно знать, что делают другие системы, чтобы обойти эту проблему. Вот варианты, которые я знаю:
- Используйте механизм безопасности SQL Server для ведения списка пользователей и ролей, а также заставляйте настольное приложение добавлять и удалять пользователей с помощью запросов T-SQL.
- Вместо непосредственного подключения к базе данных создайте какой-либо веб-сервис, работающий на сервере, и добавьте туда логику аутентификации. Сделайте каждый запрос на проверку безопасности.
Первый вариант немного уродлив, потому что вы отделяете пользователей от базы данных, поэтому пользователи больше не являются объектами первого класса, и вы не можете ссылаться на них отношениями внешнего ключа и т. Д.
Второе просто кажется серьезной проблемой производительности и большой дополнительной работы, плюс вы не можете так же легко использовать ORM-сопоставители, как NHibernate (я думаю).
У кого-нибудь есть опыт с этим? Лучшие практики?
редактировать
Подумав еще немного, может ли аутентификация SQL Server решить эту проблему? Например, если ваш пользователь должен иметь возможность вставлять и обновлять записи расписания, чтобы вы могли редактировать расписание, SQL-сервер не сможет запретить доступ к другим строкам таблицы сведений о расписании, то есть вы можете читать и записывать расписания других людей.