具有身份验证 SASS 的数据库 structure/architecture

DB structure/architecture with a auth SASS

我和我的团队正在考虑使用身份验证 SASS。

我确信 SASS 解决方案最终会比手工制作的解决方案更安全(即使使用适当的库),在我们的情况下,我们可以负担得起这笔钱。

但最让我犹豫的是这项服务将如何与我的应用程序的其余部分讨论。它会实际上简化我们的代码还是最终使它成为一个更复杂的结包?

我了解带有凭据的用户列表和最终属性存储在那里。

但是,我应该在应用程序的 (SQL) 数据库中存储什么?

假设我有 users 属于 companies 和其他 assets 一对一的关系。

我喜欢写这样的东西:

if current_user.company.assets includes current_user.assets do
  // logic here
end

我应该:

=> 但是,我无法确定用户属性与其余数据库属性之间的用户关系

=> 感觉不太安全并且暗示重复的内容,这很糟糕。

=> 稍微好一点,但是无法查询用户,连company.users 都没有

我对将通常是应用程序的核心对象外化的利润感到非常困惑。我是不是也在想单一化? :-D

谁能提点建议?更好的是来自实施它的开发者的反馈。

我在网上找到文章,他们谈论安全性和易于实施,但没有正确解决这个问题。

干杯,我希望这个问题不会被关闭,因为我对答案很好奇。

I'm highly confused on the profits of externalizing what's usually the core object of an app. Am I thinking too monolithically? :-D

是的,您认为您必须编写和控制所有代码,因此过于单一。您问了一个关于本质上将身份验证外包给现有的基于 SASS 的解决方案的问题,而您可以轻松地 编写自己的 。这是许多开发人员常犯的错误假设,尤其是在应用程序安全领域。

  • 身份验证是许多解决方案的核心要求,但它很少是解决方案的核心方面或功能

通过编写您自己的解决方案来解决通常的标准概念(身份验证),您必须编写、测试和维护您的逻辑,包括在产品的整个生命周期内了解最新的安全趋势。在直接Profit/Cost方面:

  • 花费你大量的时间和精力来做对
  • 您自己的解决方案会增加一层技术债务,未来的开发人员(内部或外部)需要先熟悉您的实施,然后才能开始维护或改进工作
  • 您直接承担维护解决方案及其数据安全的所有风险和责任。

根据您的应用程序的数据类型和管辖范围,您可能会被要求实施多因素身份验证或强制所有用户重新注册以采用更强大的安全协议,这可能有很多为您自己的解决方案努力,或者在身份验证提供程序的配置中简单地勾选一个框

业务/数据架构

需要注意区分业务领域中的AuthenticationUser这两个概念。从数据完整性的角度来看,无论您使用 wherewhat 方法来 Authenticate 您的用户重要的是数据库中有一个User的概念来关联每个用户的相关数据。

所以没有办法绕过它,你的业务领域逻辑需要一个table来代表这个业务领域中的一个User

这个 User table 应该有一个特定于应用程序域的任意 主键 ,并且 table 存储用于将 business 用户映射到 Authentication 进程的令牌。然后在整个模型中,您可以创建返回给用户的 FK 引用 table.

通过这种方式,您可以将用户映射到多个不同的提供者,或者轻松更改提供者,而对其余业务域模型的影响最小或为零。

从业务流程的角度来看,重要的是应用程序可以根据身份验证提供商的响应中提供的令牌或声明解析正确的业务User

身份验证

如果 SSO(单点登录)对您有吸引力,那么根据您的解决方案的性质和将要进行身份验证的用户类型,选择使用哪个身份验证提供程序可能会成为一个问题。如果该解决方案租给其他企业并提供以 B2B 或 B2C 为中心的活动,那么像 Azure AD 或 Google Cloud Identity 这样的企业身份验证解决方案可能是有意义的。您将在客户的身份验证域中注册您的产品,以便他们可以管理他们的用户和访问级别。

如果解决方案更 public 集中,那么您可能会考虑将其他社交媒体身份验证提供商作为简化用户身份验证的一种方式,而不是强迫他们使用您自己定制的身份验证过程,因为他们总是会忘记他们的密码也...

您没有提到您正在考虑使用哪种语言或运行时,但是如果您确实选择编写自己的身份验证服务,作为最低限度,您应该考虑实施 OAuth 2.0 实施以确保您的解决方案符合标准实践并与其他提供商兼容,您以后选择使用它们。

在基于 .NET 的环境中,我建议 Identity Server 4 作为基本安全级别,有很多关于实现的资源,其他框架应该有类似的项目或供应商,您可以自己托管。关键是,通过使用您自己的身份验证服务的标准实现,而不是编写您自己的集成到您的软件中的服务,您并没有重新发明任何东西,有很多商业和社区支持可以帮助您最大限度地减少把事情做好的努力和成本 运行.

结论

最终,如果您关心利润,让我们面对现实吧,我们大多数人都是,那么您会重新造轮子,只是因为可以增加直接实施和长期维护成本等等将直接降低 Profitability,尤其是当将现有身份验证提供程序实施到您的解决方案中的工作量非常低时。

即使您选择 今天 实施您自己的身份验证服务,以您可以轻松将该工作负载卸载到外部提供商的方式实施它也是明智的,当用户开始要求比在本机运行时提供的成本效益更严格的安全要求或附加功能时,这是中小型应用程序安全性的自然演变。

一旦在您的应用程序中实施了安全性,业务流程的其余部分通常会发生变化,我们会忽略回来审查身份验证,直到发生违规事件后,如果我们或客户检测到此类事件,因此它是重要的是,我们从解决方案的一开始就尽可能地确保安全。

虽然没有直接关系,但这个讨论让我想起了 Eric Lippert 在 SO 博客的评论中最喜欢的一句话

Eric Lippert on What senior developers can learn from beginners
...The notion that programming can be principled — that we proceed by understanding the abstractions afforded by the language, and then match those abstractions to a model of the business domain of the program — is apparently never taught to a great many programmers. Rather, many programmers proceed as though they’re exploring an undiscovered country, and going down paths more or less at random and hoping they end up somewhere good, no matter how twisted the path is that gets them there...

我们使用外部身份验证提供程序的原因之一是,在我们之前出现的大量开发人员已经吸取了教训,或者没有制定并制定了一套标准和协议,以提供 最佳实践 指南,指导用户在使用我们的软件时如何保护他们及其数据。许多这些外部供应商代表了最佳实践 实施,并且随着标准的不断发展,他们为我们维护它们,因此我们不必这样做。