,所以我正在尝试创建基本的用户系统,在此系统中,我希望用户能够具有多个角色。
说例如我的角色如下:管理员,活动组织者,捐赠者
将这些多个角色分配给用户的最佳方法是什么,然后检查它们是否具有显示某些权限的这些角色。
如果每个人只有一个角色,那么这不是问题,因为我刚刚分配了管理员= 10,组织者= 5和donator = 1等于这三个数字中的任何一个。
我无法想象有一种方法可以添加MySQL字段并用"管理员,捐赠者"填充它,因此用户将具有这两个角色?
这只是我需要创建3个单独的字段并在这些字段中放置0或1的情况,然后单独检查每个字段?
使用多个表格并加入:
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;
您将拥有角色, users and 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_id
和role_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 |
| .. | ....... | ....... |
+----+---------+---------+
这样,用户可以具有无限数量的角色。
如果您不想为如此小的东西创建两个新表。您可以利用设置数据类型内置的mySQL,也可以使用 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 |
+----+----------+----------+-----------------+