0

如果我在Rails中设置了一个基本的User模型,并给它一个is_admin:boolean, default: false属性,那么防止非管理员用户改变它的最好方法是什么?如何只允许管理员设置管理员权限?

这似乎是应该真正进入模型的那种逻辑,但构建它的最好方法是什么? ActiveRecord回调函数?

我知道我可以把它放到控制器的#update方法中,但这似乎不符合MVC最佳实践。 (并且似乎不太便携。)

这里最好的方法是什么?

+0

对于其他上下文,假设我完全按照本教程:http://railscasts.com/episodes/270-authentication-in-rails-3-1?view=asciicast –

回答

1

使用重定向拒绝访问对于控制器来说是一个完美的工作,所以在私有的before_filter方法中做到这一点就足够了,我认为是合理的。

1

为什么你说逻辑应该在模型中去?

这取决于您的实施。如果逻辑取决于current_user(即当前的管理员可以将另一个用户设置为管理员),那么逻辑应该放在控制器中。由于您所标记的问题作为轨道4,逻辑会在允许的PARAMS在你的控制器:

a = User.find_by(email: "[email protected]") 
a.toggle!(:admin) 

你会阻止:

def user_params 
    if current_user.is_admin 
    params.require(:user).permit(...your attributes here with is_admin...) 
    else 
    params.require(:user).permit(...your attributes here without is_admin...) 
    end 
end 
+0

我在想它应该在型号,这样数据库完整性不依赖于控制器。也就是说,这是应该强制执行适当的数据库更新逻辑的模型。我想管理员的财产只能通过控制器进行更改? –

+0

不确定你的意思是“数据库完整性不依赖于控制器”,但是你的整个应用程序依赖于控制器,所以你的数据库依赖于控制器。在这种情况下,您的控制器不负责更新记录,但负责传递给模型的内容,然后模型根据传递给记录的内容更新记录。 – AbM

+0

有道理。总的来说,Rails是否会拥有更胖的控制器?在这一点上,我所有的逻辑都是控制器端的,模型中没有任何东西。从我记得我的Java时代(很久以前),我们学会尽可能地将模型放入模型中,并且它绝不应该允许不正确的操作。在这种情况下,允许更新用户而不验证它是明确进行更新的管理员。轨道是否不遵循这个经验法则? –

1

我只会在控制台一样,设置管理员权限有人破解您的网站以获取管理员权限。

+0

谢谢 - 我认为这是我现在要做的。 –