设计用户认证(角色和权利)模块


15

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

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

我也想在用户每次登录和注销时都记录一个事件。我将来可能会将其扩展到其他事件。

在下面,您会发现我的第一个裂缝。请让我知道任何改进的建议,因为这是我第一次这样做。

您是否发现需要其他属性以实现基于角色的安全性以及密码规则/有效期限的约束?

数据库设计


详细博客在这里:goo.gl/ATnj6j
Suresh Kamrushi 2014年

1
我什么都不懂 在用户表中,您具有group_id。一个人可以成为多个组的成员吗?
约翰尼

Answers:


11

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

以下是一些改进建议:

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

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

  • 您的GROUP_RIGHTS表未指明谁授予了权限。为了进行审计跟踪,人们通常会记录谁更改了什么记录以及何时更改。对于您来说,这可能不是问题。

以下是有关您陈述的业务需求的几个问题,这些问题与基于“角色”的基于“安全”模式的安全模式有以下两种不同:

  • 您确定要让用户仅属于一组吗?基于角色的安全性的优点是角色往往是静态的,而履行角色的人员则经常来来往往。其中包括有些人经常“戴两顶帽子”。

  • 您的设计是仅授权的。一些系统包括授权 撤销。这使您可以说特定组没有广泛可用的权利。

  • 您的用户和帐户与USERS设计中的一样。人员ID用户ID之间通常存在区别。有些用户ID用于团队或机器,有些人具有多个用户ID用于不同的目的。这对您有帮助吗?


3

我认为按位运算符是实现用户权限的最佳方法。在这里,我展示了如何使用Mysql实现它。

以下是带有一些示例数据的示例表:

表1:权限表,用于存储权限名称及其相关的位,例如1,2,4,8..etc(2的倍数)

CREATE TABLE IF NOT EXISTS `permission` (
  `bit` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`bit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

将一些示例数据插入表中。

INSERT INTO `permission` (`bit`, `name`) VALUES
(1, 'User-Add'),
(2, 'User-Edit'),
(4, 'User-Delete'),
(8, 'User-View'),
(16, 'Blog-Add'),
(32, 'Blog-Edit'),
(64, 'Blog-Delete'),
(128, 'Blog-View');

表2:用于存储用户ID,名称和角色的用户表。角色将被计算为权限之和。
示例:
如果用户“ Ketan”具有“用户添加”(位= 1)和“博客删除”(位64)的权限,那么角色将为65(1 + 64)。
如果用户“ Mehata”具有“博客视图”(位= 128)和“用户删除”(位4)的权限,则角色将为132(128 + 4)。

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `role` int(11) NOT NULL,
  `created_date` datetime NOT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

样本数据-

INSERT INTO `user` (`id`, `name`, `role`, `created_date`)
   VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'),
   (NULL, 'Mehata', '132', '2013-01-09 00:00:00');

用户的访问权限登录后,如果要加载用户权限,则可以在下面查询以获取权限:

SELECT permission.bit,permission.name  
   FROM user LEFT JOIN permission ON user.role & permission.bit
 WHERE user.id = 1

这里的user.role“&” Permission.bit是按位运算符,它将输出为-

User-Add - 1
Blog-Delete - 64

如果我们要检查天气,则特定用户是否具有用户编辑权限-

  SELECT * FROM `user` 
     WHERE role & (select bit from permission where name='user-edit')

输出=没有行。

您还可以看到:http : //goo.gl/ATnj6j


如果许可很多,例如100,我们将怎么办?
ypercubeᵀᴹ

2
您已发布3个相同的答案-针对不同的问题!-,所有内容今天发布,相隔几分钟。这不是好习惯。如果您认为这些问题足够相同或相似,则可以投票将其作为重复项关闭(或者,如果您没有声誉可投票关闭,请对其进行标记)。
ypercubeᵀᴹ

请还编辑您的链接并说明其链接(更多详细信息,是您的博客还是其他人的博客,等等?)
ypercubeᵀᴹ2014年

请不要复制并粘贴相同的答案,而是将其全部喷洒在许多老问题上。如果这些问题相同,请将其标记为重复。
亚伦·贝特朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.