我正在创建一个用户身份验证库(用于练习)。
我要添加的一件事是,可以将用户分配给多个角色。
每个角色都有一组权限(想想editUser,createUser等)。
如果用户属于两个群组,如果任何群组有权执行某项操作,则该用户可以执行此操作。
我想知道从mysql数据库的角度来存储这些信息的最佳方法。
我在想
users : ID | username | etc
groups : ID | name | etc
user_group : group_ID | user_ID
permissions : ID | name | description (lookup table)
group_permission : permission_ID | group_ID
基本上如果一个组有权限,那么它会在group_permission中获得一个条目。
我的问题是,这是最有效的方法吗,或者我最好将每个权限作为groups表中的列并删除group_permission表?
答案 0 :(得分:1)
你看起来很漂亮并且正常化,为此赞不绝口 我缺少的一件事是非权限表,即禁止操作的表 Active Directory具有此功能,这允许您快速阻止对象的权限。
这允许您允许访问所有帐户,除了.....
如果以相反的方式进行,则必须允许访问每个对象,同时省略HR数据
第一种方式设置2个对象的权限(1个父级权限,1个孩子解雇),第二种方式可以运行数十个权限。
就个人而言,我会更新permissions
表格以包含排除项目
这将允许您将排除项附加到组和用户。
使用黑洞表来简化新权限的添加
为了简化添加新权限,您可以创建一个新的黑洞表
这不会存储任何内容,但会触发一个触发器而不是为您插入,这样您就可以隐藏数据库从插入代码规范化的事实。
CREATE TABLE bh_permission (
user_or_group_id unsiged integer not null,
isuser ENUM('user','group') not null default 'user',
permission_description varchar(255) not null,
allow_or_not ENUM('allow','forbid') not null default 'allow'
) ENGINE = BLACKHOLE;
现在您可以在表中插入指定group或user_id
INSERT INTO bh_permission VALUES ('123','group','p_HR_files_2011','forbid');
并触发处理技术细节:
DELIMITER $$
CREATE TRIGGER ai_bh_permission_each AFTER INSERT ON bh_permission FOR EACH ROW
BEGIN
DECLARE Mypermission_id INTEGER;
//like is always case-insensitive, `=` is not.
SELECT p.id INTO Mypermission_id FROM permissions p
WHERE name LIKE NEW.permission_description LIMIT 1;
IF isuser = 'user' THEN
INSERT IGNORE INTO user_permission (user_id, permission_id, allow_or_not)
VALUES (NEW.user_or_group_id, Mypermission_id, NEW.allow_or_not);
ELSE
INSERT IGNORE INTO group_permission (group_id, permission_id, allow_or_not)
VALUES (NEW.user_or_group_id, Mypermission_id, NEW.allow_or_not);
END IF;
END $$
DELIMITER ;