设计用户身份验证(角色和权限)模块

Joh*_*mes 17 database-design datatypes database-tuning relational-theory

我正在尝试为将成为 Delphi UI 应用程序后端的 MS SQL Server 数据库建模用户身份验证模块。基本上,我想拥有用户只属于一个组的用户帐户。一个组可以拥有“n”个权限。

我还想向数据库添加密码历史记录,因为用户将需要根据应用程序设置(例如,每 90 天)更改其密码。

我还想在每次用户登录和退出时记录一个事件。我可能会将其扩展到未来的其他活动。

下面你会发现我的第一个破解。请让我知道任何改进它的建议,因为这是我第一次这样做。

您是否认为需要针对基于角色的安全性和密码规则/到期期限的约束的其他属性?

数据库设计

Joe*_*own 12

根据您陈述的要求,您的模型状况良好。

以下是一些改进建议:

  • 你没有这么明确地说,所以很难说 - 但看起来你可能直接存储了用户密码。 这将是非常糟糕的! 如果您查看常见的身份验证数据库,就会发现密码以加密形式存储。您经常会看到一password列和一password_salt列。

  • 你的USER_LOGS表有一Event列。你不清楚这是如何填充的。应该有一个引用的EVENT_TYPEUSER_LOGS吗?这可能会使报告更友好。典型的事件包括登录、注销、密码失败、密码更改、密码重置、锁定、解锁……

  • 您的GROUP_RIGHTS表格没有说明谁授予了权限。出于审计跟踪目的,人们通常会记录谁更改了哪些记录以及何时更改。这对你来说可能不是问题。

以下是关于您陈述的业务需求的几个问题,它们与“教科书”基于角色的安全模式在几个方面有所不同:

  • 您确定希望用户只在一个组中吗?基于角色的安全性的优点是角色往往是静态的,而履行角色的人经常来来去去。其中包括一些人经常“戴两顶帽子”。

  • 您的设计是仅限授权的。一些系统包括grant revoke。这使您可以说特定群体无法获得广泛可用的权利。

  • 您的用户和帐户USERS在您的设计中混合在一起。人员ID用户 ID通常是有区别的。一些用户 ID 用于团队或机器,而一些人有多个用户 ID 用于不同目的。这是一个对你有帮助的区别吗?