在哪里处理用户权限:在视图、模型或控制器中?

Where to handle user rights: in view, model or controller?

我想要 3 个用户组:管理员、经理和工程师。管理员可以查看所有对象,可以更改用户所属的组等等。经理可以看到他的东西和他的工程师的东西。工程师只能看到他自己的东西。问题是将所有逻辑放置在何处:在视图中、在控制器中还是在模型中。我要制作一个会话助手 "current_user_right_on(stuff)" 并检查视图中的权限:

if current_user_right_on(stuff) == view 
  show_stuff
  if current_user_right_on(stuff) == change 
    show_edit_controls
  end
end

做这些事情的常用方法是什么?什么是经验法则?

更新 所以,现在我在控制器中

def index
  if logged_in?
    if current_user.admin?
      @stuff = Stuff.all
    else
      @stuff = Stuff.stuff_user_can_see(current_user)
    end
  else
    @stuff = Stuff.where( <anyone can see> )
  end
end

在模型中,我有方法 "stuff_user_can_see(user)" 从数据库中选择适当的记录。

这里我应该改进什么?

这个问题的最佳答案是使用预先存在的 gem 实现某种形式的基于角色的授权。这将提供助手和模型级工具,以及最佳实践示例。您可以在此处找到此类 gem 的列表 - https://www.ruby-toolbox.com/categories/rails_authorization

目前认为将授权逻辑保持在控制器级别是最佳做法。这样,无论用户是什么角色,您的视图都保持不变,因为它传递的实例变量(例如,@stuff)已经被过滤以仅显示他被授权的数据。如果需要,这也将使以后添加 API 变得更容易,因为可以重用控制器中的授权逻辑。

我建议您在尝试集成第三方授权之前先了解如何滚动自己的授权gem。否则,您会对 gem 的工作原理感到困惑,因为您不知道它在做什么。我会查看 the authorization section from Michael Hartl's Rails Tutorial book。你想知道的一切都在那里,而且比我在这里解释得更好。