CanCanCan: разрешение управлять только профилями пользователей

У меня есть модель пользователя, на которой я использую устройство и канканкан. Вот моя способность:

if user.role? :patient
         can :access_profile, User, :id => user.id
end

где псевдоним access_profile:

alias_action :show, :edit, :update, :destroy, :to => :access_profile

В моем user_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 и во 2-м запросе я тоже вижу 3, то наверное поэтому я и авторизован. Но я думаю, что id во втором запросе должен быть 4.

Что сделать, чтобы метод load_and_authorize работал корректно.


person yerassyl    schedule 29.08.2015    source источник


Ответы (1)


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

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

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

person Dawid Gosławski    schedule 29.08.2015