Я пытаюсь добавить авторизацию в довольно большое приложение, которое уже существует, но мне нужно немного запутать детали.
Вот фон:
В нашем приложении есть иерархические номера или роли, примерно такие:
BasicUser -> SuperUser -> Admin -> SuperAdmin
Для авторизации каждый экземпляр модели пользователя имеет атрибут «роль», соответствующий приведенному выше.
У нас есть RESTful-контроллер «Пользователи», который расположен под Backoffice. Короче говоря, это Backoffice :: UsersController.
class Backoffice::UsersController < ApplicationController
filter_access_to :all
#... RESTful actions + some others
end
Так вот в чем проблема:
Мы хотим, чтобы пользователи могли предоставлять пользователям разрешения на редактирование пользователей, но ТОЛЬКО если они играют «меньшую» роль, чем в настоящее время. Я создал следующее в authorization_rules.rb
authorization do
role :basic_user do
has_permission_on :backoffice_users, :to => :index
end
role :super_user do
includes :basic_user
has_permission_on :backoffice_users, :to => :edit do
if_attribute :role => is_in { %w(basic_user) }
end
end
role :admin do
includes :super_user
end
role :super_admin do
includes :admin
end
end
И, к сожалению, насколько я понял, похоже, что правило не применяется.
- Если я закомментирую правило, никто не сможет редактировать
- Если я оставлю правило, вы можете редактировать всех
Я также попробовал несколько вариантов if_attribute:
if_attribute :role => is { 'basic_user' }
if_attribute :role => 'basic_user'
и они получают тот же эффект. У кого-нибудь есть предложения?