设计Rails 3.1.1,通过种子添加管理员用户?

时间:2011-10-09 11:06:53

标签: authentication devise ruby-on-rails-3.1 admin

我有一个示例Rails 3.1.1应用程序,我已经设置了它来管理用户帐户等。

我运行了以下步骤,将admin属性添加到用户表中:

$ rails generate migration add_admin_to_user admin:boolean

在我的迁移中添加了以下内容:

class AddAdminToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :admin, :boolean, :default => false
  end

  def self.down
    remove_column :users, :admin
  end
end

然后我运行db:migrate并将以下内容添加到我的布局文件中:

<% if current_user.admin? %>
  You are ADMIN.
<%end %>

然后,为了添加第一个管理员用户,我使用了以下种子文件:

puts 'SETTING UP DEFAULT USER LOGIN'
user = User.create! :name => 'Test User', :email => 'test@test.com', :password => 'password', :password_confirmation => 'password'
puts 'New user created: ' << user.name

这很有用,所以我随后用管理员字段对其进行了调整:

puts 'SETTING UP DEFAULT USER LOGIN'
user = User.create! :name => 'Test User', :email => 'test@test.com', :password => 'password', :password_confirmation => 'password', :admin => 'true'
puts 'New user created: ' << user.name

上面的种子文件有效,但是没有显示admin标志。

我错过了什么吗?

更新:model / user / rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me
end

2 个答案:

答案 0 :(得分:13)

不要将admin添加到attr_accessible。这可能导致严重的安全漏洞。恶意用户可以按如下方式发送PUT请求:

put /users/17?admin=1

将授予用户具有id 17管理员权限的用户。 attr_accessible的重点是定义模型可以访问哪些属性。特别是这个可能不是你想要的那个。

相反,我建议您使用rake文件创建示例用户。使用以下内容将文件(user_data.rake)放在lib / tasks中,它应该可以解决问题。

namespace :db do
  desc "Fill database with sample data"
  task populate: :environment do
    admin = User.create!(name: "Test User",
                 email: "test@test.com",
                 password: "password",
                 password_confirmation: "password")
    admin.toggle!(:admin)
  end
end

这定义了一个任务db:populate,应该是创建示例用户所需的全部内容。

已完成db:migrate,只需运行db:reset,db:populate。

注意admin.toggle!。这就是魔术发生的地方。

切换方法应谨慎使用,因为它会绕过您为模型定义的回调和验证。在我提到的情况下,由于您手动使用rake任务,因此不存在可能被恶意用于批量分配的风险。您可以在此处找到有关切换方法的更多信息:http://apidock.com/rails/ActiveRecord/Base/toggle

答案 1 :(得分:3)

我同意不添加:admin给attr_accessible,这个建议很疯狂。 至于saneshark,为什么在种子的目的时创造一个任务?只需将切换放在db / migrate / seeds.rb文件中即可。 在种子文件更改中:

puts 'SETTING UP DEFAULT USER LOGIN'
user = User.create! :name => 'Test User', :email => 'test@test.com', :password => 'password', :password_confirmation => 'password', :admin => 'true'
puts 'New user created: ' << user.name

为:

puts 'SETTING UP DEFAULT USER LOGIN'
user = User.create! :name => 'Test User', :email => 'test@test.com', :password => 'password', :password_confirmation => 'password'
user.toggle!(:admin)
puts 'New user created: ' << user.name