1

我想要 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)”,它从数据库中选择适当的记录。

我应该在这里改进什么?

4

2 回答 2

2

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

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

于 2015-01-03T20:44:42.760 回答
0

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

于 2015-01-03T16:54:45.403 回答