我正在创建一个网站,其中包含每个用户或用户组的项目,用户和权限.这是一个社区协作工具,我有4个不同的权限:
我如何在数据库中为用户组实现这种权限系统?
编辑:组/权限由信誉定义,如StackOverflow.
编辑2 - 更详细:每个文件都需要具有权限,项目需要新创建文件的默认权限,我还需要设置MySQL数据库权限.
我想为ACL创建一个模式; 但是,我在几种实现方式之间徘徊.
我很确定我不想处理级联权限,因为这会导致后端和网站管理员的混乱.
我想我也可以和用户一起生活在一个角色中.像这样的设置将允许在网站增长时根据需要添加角色和权限,而不会影响现有角色/规则.
起初我打算对数据进行规范化,并有三个表来表示关系.
ROLES { id, name }
RESOURCES { id, name }
PERMISSIONS { id, role_id, resource_id }
Run Code Online (Sandbox Code Playgroud)
用于确定某个用户是否被允许的查询将如下所示:
SELECT id FROM resources WHERE name = ?
SELECT * FROM permissions WHERE role_id = ? AND resource_id = ? ($user_role_id, $resource->id)
Run Code Online (Sandbox Code Playgroud)
然后我意识到我将只有大约20个资源,每个资源最多有5个动作(创建,更新,查看等等),也许还有8个角色.这意味着我可以公然无视数据规范化,因为我永远不会有超过几百条可能的记录.
所以也许这样的架构会更有意义.
ROLES { id, name }
PERMISSIONS { id, role_id, resource_name }
Run Code Online (Sandbox Code Playgroud)
这将允许我在单个查询中查找记录
SELECT * FROM permissions WHERE role_id = ? AND permission = ? ($user_role_id, 'post.update')
Run Code Online (Sandbox Code Playgroud)
那么哪一个更正确?ACL还有其他架构布局吗?