Cancan 能力不限制关联用户的访问

Cancan ability not restricting access to associated user

Rails3.2; Ruby2.1;康康 1.6.10; Userdevise 模型。

我已按照有关基于属性限制控制器操作的说明进行操作,并设置了以下 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 工作。它仍然允许我使用 /users/4/edit 之类的路径编辑任何 User,即使那不是 userid。但是,如果我将上面的行与 if 语句一起使用,它会正常工作。

我也试过像这样传递一个块:

can :manage, User, do |usr|
  Rails.logger.debug("usr.id: #{usr.id}")
  usr.id == user.id
end

这甚至没有打印到日志中。在这里呆了几个小时,我不太确定问题出在哪里。

更新

我进行了 CanCan 调试并得到了相互矛盾的结果。使用 can :manage, User, id: user.id 行;我在控制台中得到以下结果:

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

但是,当我以用户 4

登录时,我仍然能够导航到其他用户并进行编辑(保存更改)

此外,如果我将以下内容添加到控制器,它会正常工作:

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

我的印象是,考虑到我在 ability.rb

中所拥有的,这不是必需的

所以问题最终是在控制器中我使用的是 authorize_resource 而不是 load_and_authorize_resource。一旦我切换到后者,我就可以在 ability.rb 中定义能力。