2011-10-09 107 views
2

我有我已經設置制定了管理用戶賬號等樣品的Rails 3.1.1應用Devise in Rails 3.1.1,通過種子添加管理員用戶?

我跑到下面的步驟來管理員屬性添加到用戶表:

$ 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 

我然後跑了分貝:遷移,並添加以下到我的佈局文件:

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

然後,添加我使用了以下的種子文件的第一管理用戶:

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

這一工作,所以再與管理員字段適於它:

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

上述種子文件工作,但管理標誌沒有顯示。

我錯過了什麼嗎?

更新:模型/用戶/ 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

你確定你添加管理員場到attr_accessible宏? – lucapette

+0

不!我將如何檢查? – dannymcc

+0

將模型定義添加到問題 – lucapette

回答

13

不要添加管理員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: "[email protected]", 
       password: "password", 
       password_confirmation: "password") 
    admin.toggle!(:admin) 
    end 
end 

定義一個任務DB:填充和應該是所有你需要創建示例用戶。

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

請注意admin.toggle !.這就是魔術發生的地方。

切換方法應謹慎使用,因爲它會繞過您爲模型定義的回調和驗證。在我提到的情況下,由於您是通過手動使用rake任務使用它,因此不存在可能在批量分配中惡意使用它的風險。你可以在這裏找到更多關於切換方法的信息:http://apidock.com/rails/ActiveRecord/Base/toggle

3

我同意不添加:admin到attr_accessible,那個建議很瘋狂。 至於saneshark,爲什麼創建一個任務時,這是種子的目的?只需將切換器放入db/migrate/seeds.rb文件中即可。 在你的種子文件的變化:

puts 'SETTING UP DEFAULT USER LOGIN' 
user = User.create! :name => 'Test User', :email => '[email protected]', :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 => '[email protected]', :password => 'password', :password_confirmation => 'password' 
user.toggle!(:admin) 
puts 'New user created: ' << user.name 
+0

我更喜歡這個實例中的rake任務到seed.rb的唯一原因是我可能不想在生產中推送這些特定憑證。我通常使用我的種子文件用我在開發和生產中使用的值填充數據庫。 – saneshark

相關問題