2012-02-14 19 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 
相关问题