我想拥有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
做这些事情的常用方法是什么?经验法则是什么?
UPDATE 所以,现在我已经在控制器中了
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)”,它从数据库中选择适当的记录。
我应该在这里改进什么?
答案 0 :(得分:2)
目前,将授权逻辑保持在控制器级别是最佳实践。这样,无论用户的角色如何,您的视图都保持不变,因为它传递的实例变量(例如,@stuff
)已经过滤,仅显示他被授权的数据。如果需要,这也可以使以后更容易添加API,因为控制器中的授权逻辑可以重复使用。
我建议您在尝试集成第三方授权gem之前首先学习如何推出自己的授权。否则,你会对宝石的运作方式感到困惑,因为你不知道它在做什么。我会查看the authorization section from Michael Hartl's Rails Tutorial book。你想知道的一切都在那里,并且比我在这里解释得更好。
答案 1 :(得分:0)
这个问题的最佳答案是使用预先存在的gem来实现某种形式的基于角色的授权。这将提供帮助程序和模型级工具,以及最佳实践示例。你可以在这里找到这样的宝石列表 - https://www.ruby-toolbox.com/categories/rails_authorization。