我对角色和权限架构有疑问。我知道有现有的基础模式可以管理和定义它。
但我想通过以下方法了解是否存在潜在问题或不良做法。
以下是我设想角色表的方式:
Role:
id(pk)
name(varchar)
description(varchar)
这是我的权限表:
Permissions
id(pk)
role_ids(array of role ids)
Name
Description
每个权限都可以属于多个角色。
为了识别上述内容,我在role_ids字段中存储了一个role_id数组。
上述实践是否被视为不好?
在添加新角色或为不同角色分配权限时是否会导致问题。 从上面的数组插入和删除是编程效率低吗?
我查找了现有方法,但有些方法对于我的简单用例来说似乎太复杂了。
答案 0 :(得分:2)
在关系数据库中,这被认为是一种不好的做法,因为这些数据没有规范化。正如@spickermann指出的那样,如果你想要给定角色的所有权限,那么你很难查询。
此外,通常一个角色有很多权限,一个权限可能属于许多角色,但设计一个具有多个角色的权限是很奇怪的。
您应该创建一个包含关联的第三个表,如下所示:
Role
id(pk)
name(varchar)
description(varchar)
Permissions
id(pk)
Name
Description
RolePermissions
role_id(fk)
permission_id(fk)
查看指南Active Record Associations,它有很多关于这个问题的例子以及如何在Ruby on Rails中实现它们。
答案 1 :(得分:0)
Rubygems上有一个名为rolify
的gem。宝石:https://github.com/RolifyCommunity/rolify
这里是rolify
使用的表格:
class RolifyCreateRoles < ActiveRecord::Migration
def change
create_table :roles do |t|
t.string :name, null: false
# With resource, a role can be assigned to a complete model class or to instances of it
t.references :resource, polymorphic: true
t.timestamps
end
create_table :users_roles do |t|
t.references :user, null: false
t.references :role, null: false
t.timestamps
end
add_index(:roles, :name)
add_index(:roles, [ :name, :resource_type, :resource_id ])
add_index(:users_roles, [ :user_id, :role_id ])
end
end
向用户添加角色
定义全局角色:
user = User.find(1)
user.add_role :admin
定义作用域为资源实例的角色
user = User.find(2)
user.add_role :moderator, Forum.first
定义作用域为资源类的角色
user = User.find(3)
user.add_role :moderator, Forum