【发布时间】:2010-02-20 01:09:05
【问题描述】:
我正在考虑如何在 Rails 中创建基于角色的访问控制系统。我也看到了这些伟大的项目(以及其他):
我的问题是,真的有必要为所有内容创建一个连接表吗?如果我关系中的一个表只有几个值(比如小于 100),我不能只将连接表与那个小表合并吗?)这就是我的意思......这就是我需要的:
模型
- 用户
- 组
- 角色
- 权限
- UserRoles/RolesUsers
- 组角色
- 成员(组用户)
- 角色权限
类似的...
RoleRequirement 的工作方式是创建一个roles 表和一个roles_users 连接表。这意味着如果我在一个应用程序中有 20 个可能的角色,我就有
- 20 行角色表
- 具有 n 行的 RolesUsers 表。
这意味着每次我想按角色查找用户时,我都必须加入。不过我想知道,既然应用程序中只有几个角色,为什么不直接替换这个迁移:
create_table "roles", :force => true do |t|
t.string "name"
end
create_table "roles_users", :id => false, :force => true do |t|
t.integer "role_id"
t.integer "user_id"
end
有了这个……
create_table "roles", :force => true do |t|
t.string "name"
t.integer "user_id" # or some polymorphic form
end
这会导致重复(例如大量名为“admin”的角色),但由于空间很便宜,我们可以创建一个类似Role.unique 的方法来查找所有唯一角色(摆脱那个 20 行表),人们为什么要创建连接表?
与权限相同:我可能只有 4 个权限开始:create read update delete。所以我不需要权限表和roles_permissions 表,我可以复制CRUD 权限并在权限表中拥有role_id。与 Group 相同,如果我的 roles 表中有多态列,则不需要 Group Roles。
推荐的方法是什么?
【问题讨论】:
标签: mysql ruby-on-rails join has-many-through