Authentication 身份验证/授权模式

Authentication 身份验证/授权模式,authentication,model,authorization,schema,data-modeling,Authentication,Model,Authorization,Schema,Data Modeling,是否存在用于身份验证/授权模式的最佳实践数据模型?最重要的一点是 不要存储密码 存储密码摘要。看看这个。当有人尝试进行身份验证时,您可以将其输入的摘要与您必须查看其凭据是否匹配的摘要进行比较。由角色到权限的映射组成的数据模型相当灵活,适合大多数用途 然后将角色分配给用户(基本上与组的概念相同)…一个用户可能有多个角色,并且他们的角色定义了他们拥有的权限 在代码中,您(通过其角色)检查用户是否拥有执行功能所需的权限 身份验证是独立的,只是验证用户是谁,而不是他们能做什么。通常,您应该保持这种分离(

是否存在用于身份验证/授权模式的最佳实践数据模型?

最重要的一点是

不要存储密码


存储密码摘要。看看这个。当有人尝试进行身份验证时,您可以将其输入的摘要与您必须查看其凭据是否匹配的摘要进行比较。

由角色到权限的映射组成的数据模型相当灵活,适合大多数用途

然后将角色分配给用户(基本上与组的概念相同)…一个用户可能有多个角色,并且他们的角色定义了他们拥有的权限

在代码中,您(通过其角色)检查用户是否拥有执行功能所需的权限

身份验证是独立的,只是验证用户是谁,而不是他们能做什么。通常,您应该保持这种分离(尽管有些方案的设计是为了让它们只关心用户能做什么,而不关心用户是谁)

在您的设计中,您可以将访问控制系统可视化为矩阵(角色到权限)


我还将详细介绍“不要存储密码”的答案——根本不要设计自己的身份验证方案。你可能会弄错的。重复使用一个经过验证的密码。

我将对S.Lott的回答“不要存储密码:存储密码摘要”添加一个警告:

如果你真的想防止攻击,请确保在摘要中使用;如果这是一个众所周知的算法,比如MD5,并且有人可以获得散列输出,那么在他们自己的CPU时间内,他们可以快速检查可能的密码,如果他们找到匹配的密码,那么他们就得到了密码。添加盐可以防止这种攻击(参见)


您可以尝试查看,因为它是处理身份验证的一种相当简单的方法。知名网站(OpenID)为您处理身份验证,并以加密方式声明身份为X的人已正确身份验证。然后,您只需要处理允许哪些身份X做什么的授权。您可以始终限制您信任的身份提供商(例如,您可能信任雅虎、AOL和Blogger,但不信任某个随机站点,因为从技术上讲,任何人都可以托管自己的身份提供商服务器)。

openid的一个特点是,如果有人运行自己的身份服务器,用户可以选择使用哪一个。我相信如果你愿意的话,我们会鼓励你自己设置。用户可能对此感到满意,但别忘了,这里有三个方面:用户、应用程序服务器和身份提供者服务器。身份提供者服务器(理论上)在安全性方面可能非常草率,因此应用服务器不必信任任何人。