【问题标题】:flexible roles and permissions database schema灵活的角色和权限数据库架构
【发布时间】:2015-03-04 20:51:31
【问题描述】:

我对角色和权限架构有疑问。我知道有现有的基于架构来管理和定义它。

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

这是我设想的角色表的样子:

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

这是我的权限表:

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

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

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

上述做法是否被认为是不好的?

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

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

【问题讨论】:

  • 当您想编写诸如“加载给定角色的所有权限”之类的查询时,它至少会降低效率。 has_and_belongs_to_many 是正确的方式。

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


【解决方案1】:

在关系数据库中这被认为是一种不好的做法,因为该数据未标准化。正如@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 中实现的。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2011-11-27
      • 2012-03-08
      相关资源
      最近更新 更多