Rails中的模型级授权

Model-level authorization in Rails

我想在我的Rails应用程序中在模型级别(而不是控制器)上实现授权,就像在模型上进行验证一样。最好的方法是什么?

如果在模型本身中实现,则主要问题是模型无法访问当前用户。我见过类似的解决方案:Thread.current[:user_id] = session[:user_id],但这似乎不是一个好主意。

我看到了一种不同的方法,其中创建了诸如create,find和new之类的方法的变体,并为当前用户接受了一个附加参数。

另一种方法是在User / role类中实现所有方法,例如,将使用user.posts.createuser.readable_posts.find代替Post.createPost.find

将建议使用这些方法中的哪些?有没有更好的方法来实现授权?是否有任何插件可以使此操作更容易?我需要一种适合多个角色和模型的方法。


我建议您查看声明性授权。它适用于模型和控制器。

它要做什么的方式是在applicationController中有一个before_filter来设置Authorization.current_user = current_user,其中Authorization是一个模块。

我认为这种方法是最好的方法,它可以使模型保持整洁,并且您不必记住要在任何地方都包括用户,但是可以在模型回调函数中对其进行过滤。


您为什么要这样做?控制器级别识别还不够吗?

1
2
3
4
5
if @user.is_able_to_do_this?
  do_this
else
  blah!
end

...并在您的模型中

1
2
3
4
5
6
def is_able_to_do_this
  if self.rights > Constant::Admin_level_whatever
    return true
  end
  return false
end