2015-08-29 5 views
0

У меня есть модель пользователя, на которой я использую устройство и cancancan. Вот моя способность: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

Вы уверены, что автоматическая загрузка экземпляра работает? Cancancan будет использовать класс в качестве объекта для проверки способности, если экземпляр не может быть загружен и доступ к классу всегда возвращает истину, если они определены (независимо от параметров, как :id)

Изменить load_and_authorize_resource на load_resource и проверить, если authorize! :access_profile, @user используется в access_profile действие будет также защищать доступ.

Вы также можете определить возможность на экземпляре напрямую: can :access_profile, user вместо определения класса пользователя.

Смежные вопросы