我正在尝试理解RBAC,然后在我的项目中实现一个,但目前感到困惑。
我们以论坛为例。在论坛中,成员可以发布一个帖子,编辑或删除他们发布的帖子。主持人还可以发布一个帖子,并编辑或删除任何成员的帖子。
我搜索了网页,找到了一个简单的RBAC模型,其中有用户,角色和操作,然后我有如下数据库模式:
user(user_id, ...)
role(role_id, ...)
user_role(user_id, role_id, ...)
operation(operation_id, operation, ...)
role_operation(role_id, operation_id, ...)
在操作表中,我有
(..., 'thread/post')
(..., 'thread/edit')
(..., 'thread/delete')
在代码中,我有
if ($user->isPermitted('thread/delete') {
// delete thread
}
似乎很好,直到我发现每个用户都可以删除线程,无论谁发布它。要修复它,我可能会将操作表修改为如下
(..., 'thread/post')
(..., 'thread/38900/edit')
(..., 'thread/52529/delete')
38900和52529是线程的id。我必须添加另一张表:
user_operation(user_id, operation_id)
要授予主持人(作为角色)的所有权限,我必须为发布的每个帖子插入role_operation。
所以我的问题是,使用RBAC,如何正确设计数据库,以便成员只能编辑/删除自己的线程,而版主有能力编辑/删除任何线程?