【问题标题】:Where to handle user rights: in view, model or controller?在哪里处理用户权限:在视图、模型或控制器中?
【发布时间】:2015-01-04 04:44:42
【问题描述】:

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

我应该在这里改进什么?

【问题讨论】:

  • 这对于Software Engineering 来说可能是一个更好的问题。 (不过,IMO 将在模型和控制器之间进行选择。视图不应参与此类决策。)
  • cHao 和 Cba Bhusal,请看一下我的新代码,我已将其添加到上面的原始帖子中。

标签: ruby-on-rails access-rights


【解决方案1】:

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

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

【讨论】:

  • 这正是我想听到的:“目前认为将授权逻辑保持在控制器级别的最佳做法。”
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 2012-04-21
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多