用户系统 - MySQL数据库中的多个角色

时间:2012-10-19 18:15:30

标签: mysql

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:7)

使用多个表并加入它们:

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;

答案 1 :(得分:6)

您将拥有角色用户 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 |
| .. | ....... | ....... |
+----+---------+---------+

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

答案 2 :(得分:1)

如果你不想为这么小的东西创建两个新表。 您可以使用内置 SET数据类型的MySQL,也可以将逗号分隔的角色存储在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 | +----+----------+----------+-----------------+