Rails 3.2; Ruby 2.1;康康1.6.10; User
是devise
模型。
我已按照说明限制基于属性的控制器操作,并设置了以下ability.rb
文件:
class Ability
include CanCan::Ability
def initialize(user, params)
if user
if user.admin?
can :manage, :all
elsif user.employee?
cannot :manage, User
# Works
# can :manage, User if params[:id].to_f == user.id.to_f
# Doesn't work
can :manage, User, id: user.id
else
cannot :manage, :all
end
end
end
end
我无法获得该行:can :manage, User, id: user.id
。它仍允许我使用User
之类的路径编辑任何/users/4/edit
,即使这不是id
的{{1}}。但是,如果我使用上面的行user
语句,它可以正常工作。
我也试过传递像以下一样的块:
if
甚至不打印到日志。在这几个小时,我不确定是什么问题。
更新
我通过CanCan调试,但结果相互矛盾。使用第can :manage, User, do |usr|
Rails.logger.debug("usr.id: #{usr.id}")
usr.id == user.id
end
行;我在控制台中得到以下结果:
can :manage, User, id: user.id
但是,当我以用户4身份登录时,我仍然能够导航到并编辑(保存更改)其他用户
此外,如果我将以下内容添加到控制器,它可以正常工作:
admin = User.find(1)#role of "admin"
user = User.find(4) #role of "employee"
ability = Ability.new(user)
ability.can?(:edit, user)
# true
ability.can?(:edit, admin)
# false
ability = Ability.new(admin)
ability.can?(:edit, user)
# true
ability.can?(:edit, admin)
# true
我的印象是,鉴于def edit
@user = User.find(params[:id])
unless can? :edit, @user
redirect_to dashboard_path, alert: 'You do not have sufficient privileges to edit other users.'
end
end
答案 0 :(得分:0)
所以问题最终是在控制器中我使用的是authorize_resource
而不是load_and_authorize_resource
。一旦我将其切换到后来,我就可以在ability.rb
中定义能力。