灵活的角色和权限数据库架构

时间:2015-03-04 20:51:31

标签: sql ruby-on-rails ruby oracle ruby-on-rails-4

我对角色和权限架构有疑问。我知道有现有的基础模式可以管理和定义它。

但我想通过以下方法了解是否存在潜在问题或不良做法。

以下是我设想角色表的方式:

Role:
id(pk)
name(varchar)
description(varchar)

这是我的权限表:

Permissions
id(pk)
role_ids(array of role ids)
Name
Description

每个权限都可以属于多个角色。

为了识别上述内容,我在role_ids字段中存储了一个role_id数组。

上述实践是否被视为不好?

在添加新角色或为不同角色分配权限时是否会导致问题。 从上面的数组插入和删除是编程效率低吗?

我查找了现有方法,但有些方法对于我的简单用例来说似乎太复杂了。

2 个答案:

答案 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