0

我正在一个网站上工作,每个用户都可以拥有多个角色/权限,例如基本登录、订购产品、管理其他用户等等。除此之外,还有商店,每个商店可以有多个用户管理它。每个商店也有它自己的一组权限。

我很困惑自己,不确定如何最好地在数据库中表示这一点。现在我在想:

用户角色 users_roles 商店 stores_users

但是,我是否也应该拥有 stores_roles 和 stores_users_roles 表来跟踪商店的单独权限,还是应该将角色限制在单个“角色”表中?

我原本以为只有一个角色表,但是在多个商店中拥有角色的用户呢?即,如果用户被赋予“商店产品更新”的角色,则需要某种方法来确定这是指哪个商店。store_users_roles 表可以通过 store_id 字段解决此问题,因此用户可以对商店 #42 进行“商店产品更新”和“商店产品删除”,而对商店 #84 进行“商店产品更新”。

我希望我在这里有意义。

编辑

信息很有帮助,谢谢大家。显然我有一些想法要做。这只是我正在进行的一个有趣的项目,但 RBAC 一直是我想更好地理解的东西。

4

4 回答 4

2

现在这对您来说可能很明显,但是基于角色访问控制很难。我的建议是,不要尝试自己编写,除非您希望该部分占用您希望花在“很酷的东西”上的所有时间。

有很多灵活的、经过全面测试的授权库实现了 RBAC(有时被错误地标记为 ACL),我的建议是找到一个适合您的需求并使用它。除非您是轮子极客,否则不要重新发明轮子。

于 2009-02-20T02:13:49.827 回答
1

在我看来,如果我有权在一组商店中担任某些角色,那么我可能在每个商店中都拥有相同的权限。因此,拥有一个角色表可能就足够了。所以“joe”可以做“商店产品更新”和“商店产品删除”,然后有一个 user_stores 表来列出他可以访问的商店。假设对于整个列表,他将在所有商店中拥有相同的权限。

如果业务规则是这样的,他可以在一个商店中更新和删除,但在另一个商店中只能更新,不能删除,那么您将不得不变得更复杂。

根据我的经验,您通常会被告知您需要很大的灵活性,然后一旦实施,就没有人使用它。GUI 变得非常复杂,难以管理。

如果 GUI 确实变得复杂,我建议您从商店的角度以及用户的角度来看它。换句话说,与其选择用户,然后选择他们拥有什么权限以及他们可以访问哪些商店,不如先选择一个商店,然后选择哪些用户可以访问该商店中的哪些角色可能更简单。取决于我猜有多少用户和多少商店。在过去的一个项目中,我发现用一种方法比另一种方法容易得多

于 2009-02-20T00:50:10.683 回答
1

你的模型在我看来不错。我认为您需要的唯一修改是角色的粒度。现在,你的角色只是一个操作。

但首先,您需要一个 store_role 表、一个解决多对多关系 b/wa 角色的联合表和一个 store。即,一个商店可以有多个角色,一个角色可以在多个商店中完成。

例如:StoreA 可以创建、更新、删除客户。并且可以在StoreA、StoreB 和StoreC 中删除客户。

接下来,您可以自由地将用户关联到 user_store_roles 表中的 store_role_id。

现在,一个 user_store_role 记录将有一个 user_id 和一个 store_role_id:

一个集合

SELECT * FROM USER_STORE_ROLE WHERE user_id = @userID

返回用户在所有商店中允许的所有操作。

对于特定商店中用户角色的集合,将上述内容与 user_store 表进行内部连接,添加类似的 WHERE 部分

其中 STORE_ROLE.store_id = @storeID

于 2009-02-20T01:06:53.497 回答
0

store_iduser_roles桌子上放一个。

如果这是 Rails,用户模型将have_many :stores, :through => :roles

于 2009-02-20T00:56:17.860 回答