如何使用Devise和CanCan创建管理员用户?

3
我设置了devise和cancan,但是如何使一个用户成为管理员而另一个用户不是管理员呢? 我应该使用omniauth(我只想使用Google登录),还是devise,或者cancan?
4个回答

16
为了使CanCan的这个特定功能工作,您需要在Devise的“User”模型上存储一个属性来指示特定用户是否为管理员。
首先,在您的“User”表上创建一个名为“admin”的属性:
# from command line
rails generate migration AddAdminToUser user

在迁移中,将admin属性的默认值设置为false(或true,具体取决于您希望默认情况下实现哪种行为):

class AddAdminToUser < ActiveRecord::Migration
  def change
    add_column :users, :admin, :boolean, :default => true

  end
end

运行迁移

# from command line
rake db:migrate

在你的 User 模型中,创建一个方便的方法来访问 admin 的值:

在你的 User 模型中创建一个便捷方法,以访问 admin 的值:

(Note: The above is the translated text. Below is the original content to be translated.)
In your User model, create a convenience method to access the value of admin:
# app/models/user.rb    
def admin?
    admin
end

然后,在ability.rb中,定义您想为每个用户设置的权限:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin? # Admin user
      can :manage, :all
    else # Non-admin user
      can :read, :all
    end
  end
end

请记住,User默认情况下不是管理员。您始终可以按照以下方式为现有用户启用管理员权限:

# from the Rails console
user = User.find(some_number)
user.update_attribute(:admin, true)

你好,非常感谢!只是一个问题。如果用户已经存在于user.rb中,为什么要说add_column:user呢?为什么不是add_column:admin? - Naomi K
读取整行:您正在将 admin 添加到 user 表中。 - zeantsoi
我看到用户是表,管理员是列。 - Naomi K
2
我认为迁移应该这样写:rails generate migration AddAdminToUser admin:boolean - Steve Root

2
add_column :users, :admin, :boolean, :default => true

将默认值 true 改为 false

add_column :users, :admin, :boolean, :default => false

0

这有点像“由你决定”,但简单的方法只是将布尔属性赋予用户,例如 admin = true/false,然后您可以在 ability.rb 中定义它:

class Ability
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:
    #
    #   user ||= User.new # guest user (not logged in)
    #   if user.admin?
    #     can :manage, :all
    #   else
    #     can :read, :all
    #   end
  end
end

你好,感谢您的回答。是的,我在我的ability.rb文件中有这个,但是如何使用户成为管理员呢?这段代码只是说明如何处理管理员用户。抱歉我的英语不太好,这样说通吗? - Naomi K
您将创建一个迁移,其中包含上/下方法,您将使用add_column方法在用户表中创建此属性。不要忘记为该列使用默认值。 - Jakub Kuchar


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接