4

如何设置 CanCan 的角色,以及如何将这些角色分配给用户?我现在至少希望在注册时有一个下拉菜单,供用户选择他们的角色。我不太确定我似乎一直错过的所有文档,但非常感谢任何帮助!

4

3 回答 3

4

这是一个可靠的适合 Rails 的角色管理方法。我用这个。我喜欢。从本质上讲,您创建了一个“has-and-belongs-to-many”表来关联用户和角色并定义一个函数User#has_role?来检查关联。

# file: app/models/user.rb
class User < ActiveRecord::Base
  has_many :user_roles, :dependent => :destroy
  has_many :roles, :through => :user_roles

  def has_role?(name)
    roles.pluck(:name).member?(name.to_s)
  end
end

# file: app/models/role.rb
class Role < ActiveRecord::Base
  has_many :user_roles, :dependent => :destroy
  has_many :users, :through => :user_roles
end

# file: app/models/user_role.rb
class UserRole < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
end

迁移/架构文件:

# file: db/migrate/xxx_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      t.string :email,              :null => false, :default => ""
      # ... any other fields you want ...
      t.timestamps
    end
  end
end

# file: db/migrate/xxx_create_roles.rb
class CreateRoles < ActiveRecord::Migration
  def change
    create_table :roles do |t|
      t.string :name
      t.timestamps
    end
  end
end

# file: db/migrate/xxx_create_user_roles.rb
class CreateUserRoles < ActiveRecord::Migration
  def change
    create_table :user_roles do |t|
      t.references :user
      t.references :role
      t.timestamps
    end
    add_index :user_roles, [:user_id, :role_id], :unique => true
  end
end

所以现在,您的技能文件将如下所示:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new  # support guest user
    if user.has_role?(:admin)
      can :manage, :all
    elsif user.has_role?(:nsa)
      can :read, :all
    elsif user.has_role?(:editor)
      # ... add other abilities here
    end

  end
end

需要明确的是,这并没有回答 OP 关于如何首先创建角色的问题。但是由于用户、角色和 user_roles 现在是完整的 Rails 模型,您可以使用标准的 CRUD 工具来管理它们。但在 90% 的情况下,您只需将管理员权限分配给一两个用户,这很容易在种子文件中完成,如下所示:

# file: db/seeds.rb

# create a role named "admin"
admin_role = Role.create!(:name => "admin")

# create an admin user
admin_user = User.create!(:email => "admin@admin.com")

# assign the admin role to the admin user.  (This bit of rails
# magic creates a user_role record in the database.)
admin_user.roles << admin_role
于 2014-01-03T13:20:02.903 回答
3

我大部分时间都明白了这一点。

  1. 对于设置角色,它们实际上是在您在能力类中定义它们时设置的。

例如:

    if user.has_role? :admin
        can :manage, :all
    else
        can :read, :all
    end

这基本上是“设置”管理员角色。出于某种原因,我认为您还必须在其他地方初始化该角色。

  1. 要分配角色,按照我见过的大多数教程,您需要进入 rails 控制台并使用类似于:

    user = User.find(1)
    user.add_role :admin # sets a global role
    user.has_role? :admin
    => true
    

第一行查找用户,第二行添加角色。第三个用于检查用户是否被分配到该角色。还有一些方法可以在注册时添加它,还有其他一些方法。当我遇到它们时,我会尝试在此处列出它们,但希望这可以消除将来某人的任何困惑。:)

于 2012-08-23T09:38:43.703 回答
0

我通过在用户表中放置一个角色字段来处理这个问题,角色逗号分隔在字符串字段中。我让管理员管理用户角色,对配置文件进行编程检查是否有效(使用诸如 valid_role?、has_role? 之类的函数。然后我在 CanCan 可以调用的用户模型中编写了一些函数,例如 user_can_see_...

不确定这对于自我管理的角色系统如何工作,但如果您有兴趣,可以在以下位置找到我的代码:github 上的 tws_auth

于 2012-10-19T00:17:58.727 回答