4

所以我正在尝试创建一个基本的用户系统,并且在这个系统中我希望用户能够拥有多个角色。

例如,我的角色如下:管理员、活动组织者、捐赠者

将这些多个角色分配给用户然后检查他们是否具有这些角色中的任何一个以显示某些权限的最佳方法是什么。

如果每个人只有一个角色,那么这不是问题,因为我只需分配说管理员 = 10,组织者 = 5 和捐赠者 = 1,然后执行 if 语句来检查 MySQL 数据是否等于任何这三个数字中。

我无法想象有一种方法可以添加一个 MySQL 字段并用“管理员,捐赠者”填充它,因此该用户将同时拥有这两个角色?

这只是我需要创建 3 个单独的字段并在这些字段中放置 0 或 1 并分别检查每个字段的情况吗?

4

3 回答 3

12

使用多个表并加入它们:

User
--------------
id    name
 1    test

Role
--------------
id    name
 1    Donator
 2    Organizer
 3    Administrator

User_Role
--------------
id    user_id    role_id
 1    1          1
 2    1          3


SELECT * FROM User u 
    LEFT JOIN User_Role ur ON u.id = ur.user_id
    LEFT JOIN Role r ON ur.role_id = r.id
WHERE r.name = "Administrator";

如果您知道自己只有 3 个角色并且它们很容易记住,那么查询会更容易。

SELECT * FROM User u LEFT JOIN User_Role ur ON u.id = ur.user_id WHERE ur.role_id = 3;
于 2012-10-19T18:24:01.757 回答
7

您将有一个角色用户users_roles表:

roles表将包含您的用户可以拥有的各种角色。在我的示例数据中,我声明了管理员和捐赠者角色。

roles
    id             unsigned int(P)
    description    varchar(15)

+----+---------------+
| id | description   |
+----+---------------+
|  1 | Administrator |
|  2 | Donator       |
| .. | ............. |
+----+---------------+

当然,您必须存储有关您的用户的信息。

users
    id          unsigned int(P)
    username    varchar(32)
    password    varbinary(255)
    etc.

+----+----------+----------+-----+
| id | username | password | ... |
+----+----------+----------+-----+
|  1 | bob      | ******** | ... |
|  2 | mary     | ******** | ... |
| .. | ........ | ........ | ... |
+----+----------+----------+-----+

最后,您将在users_roles表格中将两者联系在一起。在我的示例数据中,您可以看到它bob是一个捐赠者,mary既是管理员又是捐赠者。user_idrole_id都是它们各自表的外键,它们共同构成该表的主键。

users_roles
    user_id    unsigned int(F user.id)\_(P)
    role_id    unsigned int(F role.id)/

+----+---------+---------+
| id | user_id | role_id |
+----+---------+---------+
|  1 |       1 |       2 |
|  2 |       2 |       1 |
|  3 |       2 |       2 |
| .. | ....... | ....... |
+----+---------+---------+

这样,用户可以拥有无​​限数量的角色。

于 2012-10-19T18:23:01.737 回答
2

如果您不想为这么小的东西创建两个新表。您可以使用 MySQL 内置的SET 数据类型,也可以将逗号分隔的角色存储在 varchar 中并使用FIND_IN_SET()进行查询操作, 例如。

SELECT * FROM user WHERE FIND_IN_SET('admin', role)>0;

+----+----------+----------+----------------+ | id | username | password | role (varchar) | +----+----------+----------+-----------------+ | 1 | bob | ******** | admin | | 2 | mary | ******** | admin,role1 | | .. | ........ | ........ | role1,role2 | +----+----------+----------+-----------------+

于 2017-08-14T19:33:20.107 回答