3

我设置了 devise 和 cancan,但是我现在如何让 1 个用户 admin 而其他用户不是 admin?我是使用omniauth(我只想用google 登录)、devise 还是cancan?

4

4 回答 4

16

为了让 CanCan 中的这个特定功能发挥作用,您需要在您的 DeviseUser模型上存储一个属性,该属性指示特定用户是否是管理员。

首先在您的表上创建一个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

# 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)
于 2013-09-18T16:16:04.840 回答
2
add_column :users, :admin, :boolean, :default => true

将默认 true 更改为 false

add_column :users, :admin, :boolean, :default => false
于 2014-01-04T04:06:08.390 回答
0

它有点“由你决定”,但简单的只是用户的布尔属性,比如 admin = true/false,然后你可以定义能力.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
于 2013-09-18T15:58:18.233 回答
0

您可以从 devise 和 cancan gem & role 中了解更多信息

http://www.tonyamoyal.com/2010/09/29/rails-authentication-with-devise-and-cancan-part-2-restful-resources-for-administrators/

于 2013-12-12T17:20:54.423 回答