我正在创建一个权限表,它复制了linux中使用的“777”方法。
要做到这一点,我想创建一个像:
这样的表user_id,class1,class2,class3
哪些类可以是网站上需要权限的某些功能。
这看起来是一个好方法吗?这种方法有问题吗?
此外,哪种数据类型最适合此数据。我可以使用INT(3),但我假设没有复制此类事物的“二进制”数据类型
答案 0 :(得分:5)
使用set('ru', 'rg', ro', 'wu', 'wg', 'wo', 'xu', 'xg', 'xo', 'sgid', 'suid', 't')
这是位优化的。
但是,如果您需要过滤单个权限(例如“选择可以从此处读取的所有用户”),则最好将其实现为简单的多对多表:
user_permissions (object_id, user_id, permission ENUM ('r', 'w', 'x'))
group_permissions (object_id, group_id, permission ENUM ('r', 'w', 'x'))
other_permissions (object_id, permission ENUM('r', 'w', 'x', 'sgid', 'suid', 't'))
在其自己的记录中拥有每个权限,创建PRIMARY KEY
约束:
object_id, permission, user_id
object_id, permission, group_id,
object_id, permission
和查询:
SELECT u.id
FROM user_permissions up
JOIN users u
ON u.id = up.user_id
WHERE object_id = $object
AND permission = 'r'
UNION
SELECT g.user_id
FROM group_permissions gp
JOIN user_groups ug
ON ug.group_id = gp.group_id
WHERE object_id = $object
AND permission = 'r'
UNION
SELECT u.id
FROM users u
JOIN other_permissions op
ON object_id = $object
AND permission = 'r'