我用 c# & SQLite 编写了一个应用程序,用于存储一家拥有大约 500 名员工的公司中所有员工的数据。我想将数据库和应用程序放在文件服务器/共享文件夹(MS 服务器)中。然后,所有员工的桌面上都会有应用程序的快捷方式。我想根据用户运行应用程序的权限启用/禁用一些输入字段(文本框)。这样做的最佳做法是什么?
我希望用户只能通过我的应用程序读取/写入数据库(应用程序位于同一数据库文件夹中)。我不希望用户在没有我的应用程序的情况下访问数据库。怎么做?
如果您不希望用户访问您的数据库,您应该创建一个客户端服务器架构。
您可以在与文件服务器相同的机器上运行您的服务(作为 Windows 服务运行),并使用 WCF 在服务器和客户端之间进行通信。您从您的服务器访问您的数据库,并让您的服务器验证您的用户并验证他们是否有权访问应用程序。
您可以欺骗并尝试在客户端应用程序中“隐藏”数据库凭据,但这是一种隐蔽的安全性,任何具有一定编程技能或类似技能的人都可以找到数据库的凭据并直接连接到数据库。
我不希望用户在没有我的应用程序的情况下访问数据库
如果您的应用程序将通过 Windows 文件共享直接访问 SQLite 数据库,这是不可能的。当然,你可以让它不方便,但这并不是真的可能。
真正实现这一点的唯一方法是引入一些中间件。
这通常是一个服务(也许是 WCF),它侦听来自客户端应用程序的连接,对它们进行身份验证,并管理对底层数据库的所有访问。数据库将存储在仅对服务器可见的位置,而不是通过 Windows 共享对您的用户可见的位置。
此外,对于多用户系统,SQLite 并不是一个很好的选择。您可以在这里用一块石头杀死两只鸟 - 切换到接受网络客户端连接的 DBMS(MS SQL Server Express 是免费的,MySQL、PostgreSQL 也是常见的免费选择),并构建您的应用程序以直接连接到数据库服务器(也可以像这样使用集成的 Windows 身份验证,因此您可以避免显式登录)。在一个简单的场景中,这可能就足够了,并且避免了您需要构建显式服务层。
在更复杂的场景中,在应用程序和数据库之间有一个中间件层仍然有意义 - 这样,您可以更改数据库设计而不更改应用程序设计并部署到所有客户端机器 - 相反,只需更改中间件层在一个地方,您的应用程序不会知道其中的区别。