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

dan*_*mcc 2 authentication admin devise ruby-on-rails-3.1

我有一个示例Rails 3.1.1应用程序,我已设置为管理用户帐户等.

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

$ rails generate migration add_admin_to_user admin:boolean
Run Code Online (Sandbox Code Playgroud)

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

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

  def self.down
    remove_column :users, :admin
  end
end
Run Code Online (Sandbox Code Playgroud)

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

<% if current_user.admin? %>
  You are ADMIN.
<%end %>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这很有用,所以我随后用admin字段对它进行了调整:

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
Run Code Online (Sandbox Code Playgroud)

上面的种子文件工作,但没有显示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
Run Code Online (Sandbox Code Playgroud)

san*_*ark 13

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

put /users/17?admin=1
Run Code Online (Sandbox Code Playgroud)

这将授予用户具有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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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