1

在 MySQL 数据库中存储用户凭据的最佳方法是什么。我的意思是结构,而不是数据(散列与纯文本)。

我有我们得到的网站

Root Admin (1)

Client Admin (1) 
Client Sub-Admins (N)

Employer Admin (N)
Employer Sub-Admins (N)

以上用户在后台登录

Users (N)

用户在网站前端登录

N - 表示无限

猜猜我的问题是我应该把所有管理员放在同一张桌子上吗?然而,雇主不像客户管理员那样受信任。

如果我将管理员放在不同的表中,我如何在 PHP 中进行身份验证?从两个表中获取数据并合并到数组中,然后如果用户存在则在数组中查找?

4

4 回答 4

3

如果您只拥有一个根/客户端管理员,我建议您简单地user_id单独存储它们的值,可能在一个配置文件中,该配置文件很难通过 SQL 注入之类的方式进行修改。否则,以下方案应该允许您相当灵活地将尽可能多的用户分配给尽可能多的组。

TABLE users
  user_id INT PK AUTO_INCREMENT
  user_name VARCHAR
  user_password VARCHAR
  ...

TABLE groups
  group_id INT PK AUTO_INCREMENT
  group_name VARCHAR
  [possible permissions declarations, 
    or create a similar group_perms table]
  ...

TABLE user_group_map
  user_id INT PK
  group_id INT PK
于 2012-11-01T17:37:37.773 回答
1

一种方法是将身份验证/用户配置文件数据与其可能的角色数组分开。因此,为您的用户分配角色。地狱,为你的角色分配上下文。在我看来,用户和角色之间存在一对多的关系,其中角色被分配了一个上下文(雇主管理员、客户管理员、一般管理员......)。

于 2012-10-29T18:16:05.413 回答
0

我在这篇文章中描述了一个用户和组权限系统(忽略标题——原来的问题措辞不当): Applying column permissions for a table over a trigger

于 2012-11-04T02:25:39.873 回答
0

我不会仅仅根据我对用户的信任程度来使用多个表来分隔用户。在阅读您的问题和评论后,您必须为根管理员、客户管理员、雇主管理员和普通用户创建单独的表,因为每个组的信任级别不同。当您开始编码时,即使只有两个表,实施/维护也会变得非常难看......

不过,您似乎非常坚定地使用单独的表,如果您选择这样做,您可以使用一些技术“隐藏”它,例如,创建一个视图来合并这些表,在您的 DAO 中使用 SQL 联合,或者阅读每个表并以编程方式合并数据等。同样,当您构建应用程序时,您很可能会遇到此设计的问题。

我宁愿使用单个表,users并介绍roles它们之间具有多对多关系的概念。在创建用户时,我会将每个用户与一个默认角色关联(例如,用户root-admin具有 root-admin 角色)以及他们似乎适合的任何其他角色(例如,用户cleint-admin有一个额外的client-sub-admin等角色)根据要求,可能存在与用户不直接相关的角色,例如。客人会员

我还将介绍contexts具有与角色的可选多对多关系的应用程序的概念,然后最初将角色root-admin与应用程序上下文相关联,意味着他/她没有任何限制。将根据业务需求创建额外的上下文(例如,角色employer-admin是上下文hire-employees的一部分等)

授权时,安全管理器组件可以根据用户及其关联的角色/上下文授予/拒绝访问权限,并在必要时包含附加逻辑(例如,用户被禁用)。

您的下一个问题是您拥有某些用户的额外数据,这些数据不适用于其他用户。为了解决这个问题,我将引入与profiles用户表具有可选的一对一关系的表(并非每个用户都有个人资料,例如用户root-admin没有)。

架构(草稿):

 __________________                    __________________
|USERS             |                  |ROLES             |
|==================|                  |==================|
|id                |                  |id                |
|username          |  1..*      1..*  |name              |
|password          |  --------------  |description       |
|failedattempts    |                  |...               |
|disabled          |                  |                  |
|...               |                  |                  |
|__________________|                  |__________________|

        | 1                                   | 0..*
        |                                     |
        |                                     |
        |                                     |
        | 0..1                                | 0..*
 __________________                    __________________
|PROFILES          |                  |CONTEXTS          |
|==================|                  |==================|
|id                |                  |id                |
|firstname         |                  |name              |
|lastname          |                  |description       |
|email             |                  |...               |
|dob               |                  |                  |
|...               |                  |                  |
|__________________|                  |__________________|
于 2012-11-02T15:01:05.013 回答