在哪里处理用户权限:在视图、模型或控制器中?
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。你想知道的一切都在那里,而且比我在这里解释得更好。
我想要 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。你想知道的一切都在那里,而且比我在这里解释得更好。