我想在模型级别(而不是控制器)上的Rails应用程序中实现授权,方式与模型验证完成相似。这样做的最佳方式是什么?
如果在模型本身中实现,则主要问题是模型无法访问当前用户。我见过像Thread.current[:user_id] = session[:user_id]
这样的解决方案,但这似乎不是一个好主意。
我已经看到了一种不同的方法,其中创建了诸如create,find和new等方法的变体,为当前用户接受了一个额外的参数。
另一种方法是实现User / role类中的所有方法,例如,将使用user.posts.create
或user.readable_posts.find
代替Post.create
或Post.find
。
建议采用以下哪种方法?有没有更好的方法来实施授权?是否有任何插件可以让这更容易?我需要一种能够很好地适应多种角色和模型的方法。
答案 0 :(得分:1)
我建议你看看declarative authorization。它适用于模型和控制器。
你所要求的方式就是在applicationController中设置一个before_filter,它设置Authorization.current_user = current_user
授权是一个模块。
我认为这种方法是最好的方法,它可以保持模型清洁,您不必记住在任何地方都包含用户,而是可以在模型回调函数中对其进行过滤。
答案 1 :(得分:0)
你为什么要这样做?控制器级别识别不够吗?
if @user.is_able_to_do_this?
do_this
else
blah!
end
......并在你的模特中
def is_able_to_do_this
if self.rights > Constant::Admin_level_whatever
return true
end
return false
end