我正处于困境,我的应用上有一大堆与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
这一直在继续。谢谢你提前
答案 0 :(得分:4)
如果你使用House.find(params[:id])
,你就会有一个潜在的安全漏洞,因为给定的用户可以简单地更改网址中的数字并访问不同用户的房屋。因此,如果你走这条路,你必须添加一些东西来保护无法访问。
OTOH,current_user.house
将他们留在自己的房子里,但需要管理员职能的替代代码。
对于简单的应用程序,您可以手动执行此操作,但对于较大的应用程序,您可能需要考虑授权框架,例如cancan或declarative_authorization,您可以更轻松地定义权限。
我自己使用decl_auth,并且我的所有控制器都使用其加载资源filter_resource_access
的方法(加载适当的资源或者抛出错误,如果不允许)或者用House.with_permissions_to(:index)
手动加载{{1}}如果我有权加载它,只给我一个房子。
与往常一样,Railscasts最好说:cancan和declarative authorization。