处理用户权限的位置:在视图,模型或控制器中?

时间:2015-01-03 13:45:04

标签: ruby-on-rails access-rights

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

我应该在这里改进什么?

2 个答案:

答案 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