我有一个示例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
答案 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