Authentication 在Rails 3.1.1中设计,通过seed添加管理员用户?

Authentication 在Rails 3.1.1中设计,通过seed添加管理员用户?,authentication,devise,ruby-on-rails-3.1,admin,Authentication,Devise,Ruby On Rails 3.1,Admin,我有一个示例Rails 3.1.1应用程序,我已经设置了Desive来管理用户帐户等 我运行了以下步骤向用户表添加admin属性: $ rails generate migration add_admin_to_user admin:boolean 在我的迁移中添加了以下内容: class AddAdminToUser < ActiveRecord::Migration def self.up add_column :users, :admin, :boolean, :def

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

我运行了以下步骤向用户表添加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
类AddAdminToUserfalse 结束 def自动关闭 删除列:用户,:管理员 结束 结束 然后,我运行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
显示“设置默认用户登录”
user=user.create!:名称=>'测试用户',:电子邮件=>'test@test.com',:password=>password',:password\u confirmation=>password'
放置“创建的新用户:''测试用户',:email=>'test@test.com“,:password=>password',:password\u confirmation=>password',:admin=>true”

将“新用户已创建:”不向属性添加管理员。这可能导致重大安全漏洞。恶意用户可以发送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!。这就是魔法发生的地方


应该谨慎使用toggle方法,因为它绕过了为模型定义的回调和验证。在我提到的例子中,由于您是从rake任务手动使用它,因此在大规模分配中没有恶意使用它的风险。你可以在这里找到更多关于切换方法的信息:

我同意不要将:admin添加到attr\u accessible,这个建议太疯狂了。 至于saneshark,既然这是seed的目的,为什么还要创建一个任务呢?只需在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
显示“设置默认用户登录”
user=user.create!:名称=>'测试用户',:电子邮件=>'test@test.com“,:password=>password',:password\u confirmation=>password',:admin=>true”
放置“创建的新用户:''测试用户',:email=>'test@test.com',:password=>password',:password\u confirmation=>password'
user.toggle!(:admin)

放置“新建用户:”是否确实已将管理员字段添加到属性可访问宏中?否!如何检查?将模型定义添加到问题完成。请看我更新的问题。啊,我明白了,我已经在attr_可访问宏中添加了:admin,现在它可以工作了。谢谢与seed.rb相比,我在本例中更喜欢rake任务的唯一原因是,我可能不想在生产中推送这些特定凭证。我通常使用种子文件来填充数据库中我在开发和生产中使用的值。
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
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