Cancan能够限制对相关用户的访问

时间:2015-01-27 08:22:57

标签: devise authorization cancan

Rails 3.2; Ruby 2.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。它仍允许我使用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

中的内容,这不应该是必要的

1 个答案:

答案 0 :(得分:0)

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