使用Rails 3.2。我试图通过检查所有crud操作的用户权限来保护我的应用程序。以下是其中一个例子:
class StatesController < ApplicationController
def create
@country = Country.find(params[:country_id])
if can_edit(@country)
@state.save
else
redirect_to country_path
end
end
def destroy
@country = Country.find(params[:country_id])
if can_edit(@country)
@state = State.find(params[:id])
@state.destroy
else
redirect_to country_path
end
end
end
class ApplicationController < ActionController::Base
def is_owner?(object)
current_user == object.user
end
def can_edit?(object)
if logged_in?
is_owner?(object) || current_user.admin?
end
end
end
我注意到我在许多控制器中包装了can_edit?
。有干燥的方法吗?
注意:所有必须包含一个对象,以检查登录用户是否为所有者。
答案 0 :(得分:0)
您正在寻找授权库。您应该查看CanCan,它允许您设置特定用户或用户组可以访问哪些对象的特定规则。
它有一个方法load_and_authorize_resource
,您可以在给定的控制器中调用它。所以你的雕像控制器看起来像:
class StatesController < ApplicationController
load_and_authorize_resource :country
def create
@state.save
end
def destroy
@state = State.find(params[:id])
@state.destroy
end
end
CanCan将首先加载国家/地区并确定用户是否有权查看此资源。如果没有,它将引发错误(您可以在该控制器或ApplicationController中进行救援以返回适当的响应“。)然后,您可以在任何控制器操作中访问@country
,知道用户有权这样做。