2012-10-19 39 views
3

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

例如说我有角色如下:管理员,活动主办单位,捐赠者

什么是这些多个角色分配给用户,然后检查他们是否有这些角色的用于显示一定的最好方式权限。

如果每个人只有一个角色,那么它不会成为一个问题,因为我只是分配了Administrator = 10,Organizer = 5和Donator = 1,然后执行if语句来检查MySQL数据等于这三个数字中的任何一个。

我无法想象有一种方法可以添加一个MySQL字段并用“Administrator,Donator”填充它,因此该用户将拥有这两个角色?

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

回答

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; 
+0

好吧,现在我可以通过以下查询获得特定用户在阵列中显示的角色ID: SELECT role_id FROM wp_users u LEFT JOIN users_roles你打开u.id = ur.user_id哪里? id ='$ user_ID' 我该如何制作它,因此它显示了角色名称而不是role_id。 – Tenatious

+1

** SELECT role.name AS name FROM wp_users u LEFT JOIN users_roles ur ON u.id = ur.user_id LEFT JOIN role r ON ur.role_id = r.id WHERE u.id ='$ user_ID'** - 您应该查看参数化查询。 –

5

你将有一个角色用户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 | 
| .. | ....... | ....... | 
+----+---------+---------+ 

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

+0

哈 - 你赢了,包括数据类型和索引/外键。 – kmfk

1

如果您不想为这样的小事情创建两个新表。 您可以利用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 | +----+----------+----------+-----------------+