如何向 Delphi 应用程序添加多用户功能? [关闭]

Posted

技术标签:

【中文标题】如何向 Delphi 应用程序添加多用户功能? [关闭]【英文标题】:How to add multi users feature to a Delphi app? [closed] 【发布时间】:2019-12-02 15:13:20 【问题描述】:

我目前正在开发一个需要多用户功能的桌面(数据库:访问)Delphi 应用程序(每个用户都有他的权限,交易历史)。

我该怎么做?

我找到了this article,他们使用了 mysql 并且对它不熟悉,在 Access 中解释相同的方法将不胜感激。

【问题讨论】:

这个范围非常广泛 - 它实际上与数据库无关,但取决于您创建自己的用户结构。 Jet 有工作区,其中有组、用户和权限。但我们甚至不知道您在使用什么。 @SertacAkyuz Jet 基于工作组的安全性非常过时且不安全。例如,请参阅this comment。它很容易被破解。 【参考方案1】:

您的问题有点宽泛,但这里有一些建议来实现您的期望:

即使数据库有用户认证,也不要依赖它:

身份验证是高度特定于数据库的,因此您的代码不会轻易迁移到另一种数据库; 出于安全原因,泄露数据库凭据总是一个坏主意:任何能够连接到数据库的人都可以使用原始 SQL 对其进行修改...

因此,在理想情况下,我会使用 n 层架构,并将身份验证保留在服务器端。但它不适用于 RAD 应用程序。

一种典型的方法是定义一些User 表,带有一个ID,并使用例如身份验证。散列密码。然后是其他一些UserRight 表,其特征名称为字符串键,我将在我的 VCL/UI 代码中对其进行测试:例如"ModifyThisKindOfData", "ExportThisKindOfContent"... 例如如何区分Authorization and Authentication。

关于安全性,如果您使用 Access,则需要使用正确的密码散列法(例如,使用带有密码和存储盐的 PBKDF2/SHA-256)以及对User 进行签名来保护授权和身份验证和UserRight 表行,例如使用 HMAC-SHA-256。然后在软件中进行验证,以检测 DB 是否已回火。它将避免最明显的安全漏洞。但是切换到适当的 n 层设计,或者客户端-服务器数据库会更好。

【讨论】:

Access 不是客户端-服务器数据库,而是基于文件的数据库。实现真正安全的基于用户的身份验证和角色几乎是不可能的,因为 Access 要求所有用户都具有对数据库文件的写入权限。你的指针并不真正适用于这个问题。 @ErikA,嗯,Access 不是一个好的数据库选择。然而,这里所说的一切都可以为 Access 开发(服务器层将访问 DB 层)。 是的,用户可以直接在 Access 中打开数据库文件并编辑他们的权限/哈希值,而无需使用您的 Delphi 应用程序,因此您提供了 0 安全性。一半的建议会导致不安全的应用程序。这比没有建议更糟糕。 @ErikA 当然,对于一个简单的直接密码哈希。但这是不好的做法。使用相当例如BCrypt 或 HMAC/PBKDF2 over SHA-256,带有一个秘密和一个存储的盐。您可以对用户权限字段应用类似的想法,并为其添加数字签名。因此,使 Access 数据库对于身份验证和授权都足够安全并非不可能。即使任何人确实可以直接修改其内容。我将此信息添加到我的答案中。 @ArnaudBouchez 仍然不是真正的安全。您还没有考虑到数据库可供用户直接编辑他们的交易历史,或者实际上,任何不是用户表的东西(这是一个非常明显的安全漏洞 imo),或者在他们喜欢的时候删除其他用户。此外,用户在调整行后将有权访问重新签署行所需的所有组件(如果他不这样做,他将无法更改他的密码),因此当一个人想要升级他的行时,这只是一个额外的障碍特权但不是真正的安全。

以上是关于如何向 Delphi 应用程序添加多用户功能? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

delphi 一个窗体添加多组单选框问题

如何首先使用代码向 Identity 默认表 AspNetUsers 添加多对多关系?

我们可以在 iOS 中同时向一个窗口添加多个子视图吗?

Sonata Admin Bundle - 添加多步骤批处理操作

IOS/Core-Data:添加多对多关系

添加多个子视图的最佳方法 UIViewControllers