我有用户模型,我使用设备和cancancan。 这是我的能力:
if user.role? :patient
can :access_profile, User, :id => user.id
end

其中access_profile别名为:
alias_action :show, :edit, :update, :destroy, :to => :access_profile

在我的users_controller中,我使用load_and_authorize_resource。 例如,当我尝试" users / 4"和current_user.id = 3 我能够到达那里。
在日志中,我看到了:
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 4]]
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 3]]
Rendered users/show.html.erb within layouts/application (0.4ms)

这里的第一个查询来自set_user方法。我想第二个查询加载我的资源进行授权。在这里,因为current_user.id = 3,在第二个查询中,我也看到3,我猜这就是我被授权的原因。但是第二个查询中的id必须是4,我猜。
如何使load_and_authorize方法正常工作。
答案 0 :(得分:0)
您确定自动加载实例有效吗?如果无法加载实例,Cancancan将使用Class作为检查能力的对象,如果已定义,则对Class的访问将始终返回true(无论:id
等参数如何
将load_and_authorize_resource更改为load_resource,并检查access_profile操作中使用的authorize! :access_profile, @user
是否也会保护访问权。
您还可以直接在实例上定义能力:
can :access_profile, user
而不是在User类上定义。