Cancan 能力不限制关联用户的访问
Cancan ability not restricting access to associated user
Rails3.2; Ruby2.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
工作。它仍然允许我使用 /users/4/edit
之类的路径编辑任何 User
,即使那不是 user
的 id
。但是,如果我将上面的行与 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
中定义能力。
Rails3.2; Ruby2.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
工作。它仍然允许我使用 /users/4/edit
之类的路径编辑任何 User
,即使那不是 user
的 id
。但是,如果我将上面的行与 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
中定义能力。