我在一个dilema上,有很多对象与我的应用程序上的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
这种情况还在继续。提前感谢
如果你使用House.find(params[:id])
,你会有一个潜在的安全漏洞,因为给定的用户只需更改url中的数字,就可以为另一个用户访问房子。因此,如果你走这条路,你必须添加一些东西来保护未授权访问。
OTOH,current_user.house
将它们保留在自己的房子里,但需要用于管理功能的替代代码。
对于简单的应用程序,您可以手动完成,但对于较大的应用程序来说,您可能需要考虑授权框架,如cancan或declarative_authorization,在这些框架中您可以更容易地定义权限。
我自己使用decl_auth,我的所有控制器要么使用filter_resource_access
加载资源的方法(加载适当的资源,如果不允许,则抛出并出错),要么手动使用House.with_permissions_to(:index)
,只有当我有权加载它时,它才会给我一个房子。
和往常一样,Railscasts说得最好:cancan和声明性授权。