【问题标题】:Where to put user access controls? The controller or the model?在哪里放置用户访问控制?控制器还是模型?
【发布时间】:2011-05-28 00:16:39
【问题描述】:

我知道我们应该避免将逻辑放入控制器中。那么实现用户访问控制之类的正确方法是什么。假设我有User,其中每个实例都有一个标志方法admin?,用于确定用户是否可以访问其他用户的信息。


选项 1:在自定义模型中放置访问控制

型号:

class User < ActiveRecord::Base
  def self.get_list(accessor)
    return [] unless accessor.admin?
    self.all
  end
end

控制器:

class UsersController < ApplicationController
  def index
    @users = User.get_list(current_user)
  end
end

current_user 可能会在应用程序控制器的某处定义。

选项 2:在控制器中放置访问控制

型号:

class User < ActiveRecord::Base
end

控制器:

class UsersController < ApplicationController
  def index
    @users = current_user.admin? User.all : []
  end
end

还有一些外围后果,例如测试的去向和实施方式。


我的直觉是这两个选项中的第一个更可取,但我过去只使用过选项 2。此外,似乎普遍接受的(据我所知)在控制器级别执行操作范围访问过滤器的做法如下:

class UsersController < ApplicationController
  before_filter :verify_logged_in
end

【问题讨论】:

    标签: ruby-on-rails model-view-controller design-patterns


    【解决方案1】:

    作为一个 rails 新手,对我来说,第二个选项似乎更容易阅读和理解。我更喜欢如何阅读控制器中的单行代码并准确了解您在做什么。

    在第一个示例中,此逻辑隐藏在其他地方(显然是模型,但我是菜鸟,记住!)并且看起来有点冗长(对于这个特定示例)。

    我并不是说让新孩子更轻松是一件好事,只是指出一个偏好。

    【讨论】:

      【解决方案2】:

      任何控制应用程序路由的逻辑都属于您的控制器。至于你的例子,第一个更可取,但实际上并没有太多。

      固执己见的框架很容易让我们几乎痴迷于以感知正确的方式做事。在您的示例中,我认为将如此少量的逻辑留在您的控制器中是完全可以的。如果要对其进行抽象,请给它一个描述性名称,以更好地描述该方法的作用,否则您只会使代码不必要地难以阅读。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 2016-08-24
        • 2014-03-20
        • 2010-11-13
        • 1970-01-01
        • 2014-09-22
        相关资源
        最近更新 更多