2012-02-14 50 views
0

我在構建一個簡單的博客式應用程序。我真的只需要管理員和非管理員用戶,所以看起來在用戶模型中有一個名爲admin(boolean)的簡單列就足夠了。用戶模型,attr_accessible和admin

我現在使用Devise進行授權,並添加了管理員列。我試圖在seeds.rb中設置我的默認管理員用戶(我自己),但管理員出來時爲false,除非我將管理員列添加到attr_accessible。看起來這將是一個安全問題,但是,我通常不希望管理員用戶能夠被另一個管理員創建。什麼是正確的,安全的方式來做到這一點?

回答

0

您非常正確地將管理員設置爲不是attr_accessible,這只是禁止通過批量分配進行設置。您仍然可以通過單獨設置管理員來設置管理員。例如:

user = User.new(:name => 'joe') ... 
user.admin = true 
user.save 
+0

還有'User.create(name:'joe'){| u | u.admin = true}' – Alexey 2012-05-03 12:25:36

2

您想要在內部處理設置admin布爾值。不要將其暴露於大規模分配。

讓您的用戶模型自動將第一個用戶(您)默認爲管理員。使用before_create方法爲這個...

# models/user.rb 
before_create :make_first_user_an_admin 

def make_first_user_an_admin 
    self.admin = self.class.count == 0 # sets true if no users exist, false otherwise 
end 

然後用一個實例方法來設置adminship ...

# models/user.rb 
def toggle_admin 
    self.admin = !self.admin 
    save 
end 

後衛這個方法在你的控制器......

# controllers/users_controller.rb 
def change_adminship 
    if current_user.admin 
    @user.toggle_admin 
    else 
    raise "Can't do that." 
    end 
end 
相關問題