【问题标题】:Rails current_user best practiceRails current_user 最佳实践
【发布时间】:2012-03-22 12:23:42
【问题描述】:

我处于两难境地,我的应用程序上有大量与 current_user 关联的对象。而且不知道在我的控制器中我是否继续使用 ID 来查找这些对象或直接放置 current_user + 对象。

示例:

class HousesController < ApplicationController

 def show
      @house = House.find(params[:id]) **or?** @house = current_user.house 
    end

 def edit
      @house = House.find(params[:id]) **or?** @house = current_user.house 
    end
end

而且这种情况一直在继续。提前谢谢

【问题讨论】:

  • 我会坚持使用params[:id]。如果以后您决定添加一个额外的功能,例如,管理员可以编辑任何房子,使用current_user.house 可以防止这种情况发生。
  • 所以,为了灵活性,保留 ID 更好,是的,确实如此,但您注意到,如果您直接分配,感觉您获得了性能?
  • 在这样一个简单的案例中,您无处靠近需要担心性能的地方。
  • 但是这样不会提高db上的查询量吗?

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 rubygems


【解决方案1】:

如果您使用House.find(params[:id]),则存在潜在的安全漏洞,因为给定用户可以简单地更改 url 中的数字并为其他用户访问房屋。所以如果你走这条路,你必须添加一些东西来保护未经授权的访问。

OTOH,current_user.house 将它们留在自己的房子里,但需要用于管理功能的备用代码。

对于简单的应用程序,您可以手动执行此操作,但对于较大的应用程序,您可能需要考虑使用授权框架,例如 cancandeclarative_authorization,以便更轻松地定义权限。

我自己使用 decl_auth,我所有的控制器要么使用它的方法通过 filter_resource_access 加载资源(加载适当的资源,如果不允许,则抛出和错误)或手动使用 House.with_permissions_to(:index),这只会给我一个房子,如果我有权加载它。

一如既往,Railscast 说得最好:cancandeclarative authorization

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2013-10-01
    • 2015-08-26
    相关资源
    最近更新 更多